quick sort analyse

2023-11-04 01:58
文章标签 sort quick analyse

本文主要是介绍quick sort analyse,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

快速排序及其分析

前言

快速排序的平均情况下是O(nlogn),但是一般都比其他运行时间为O(nlogn)的算法都要快,因为它隐藏的常数因子比较小,但是在最坏情况之下,快速排序的运行时间是O(n2)。

快速排序过程

快速排序采用的思想是分治思想,就像合并排序算法的思想一样,合并排序算法是从数组的中间开始分治,直到分为N个分组,最后分别合并N个分组的解。如下图,有原始数组A = {1, 3, 4, 5, 7, 2, 6, 8, 0}

image

快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。

基准

基准的挑选会影响到算法的性能,一般情况将序列的第一个元素作为基准。

分区算法

设两个指针left和right,一个从左往右扫描,一个从右往左扫描;对于左指针,如果左指针所指的元素的值小于或者等于基准值,那么指针往右移一位,如果大于基准值,则和基准值交换;同理,对于右指针,如果右指针所指的元素的值大于或者等于基准值,那么指针往左移一位,如果小于基准值,则和基准值交换。代码如下:

   1: int Partition(int A[], int p, int r)
   2: {
   3:     int privot = A[p];  //基准
   4:     // 设两个指针
   5:     int left = p;   //从左往右扫描
   6:     int right = r;  //从右往左扫描
   7:     
   8:     while (right > left)
   9:     {
  10:         while (right > left && A[right] >= privot)  
  11:         {
  12:             right--;
  13:         }
  14:  
  15:         A[left] = A[right];
  16:  
  17:         while (right > left && A[left] <= privot)
  18:         {
  19:             left++;
  20:         }
  21:  
  22:         A[right] = A[left];
  23:     }
  24:  
  25:     A[left] = privot;
  26:     return left;
  27: }

   1: void QuickSort(int A[], int p, int r)
   2: {
   3:     int pivot;
   4:  
   5:     if (r > p)
   6:     {
   7:         pivot = Partition(A, p, r);
   8:         QuickSort(A, p, pivot-1);
   9:         QuickSort(A, pivot+1, r);
  10:     }
  11: }

 

性能分析

最好情况

每次基准的最终位置都是在数组中间位置,从而使规模为N的问题分为2个规模为N/2的问题,即T(n) = 2T(n/2) + Θ(n),用递归树分析或者主定理得到时间T(n) = O(nlogn)。

最坏情况

每次基准的最终位置都是第一个位置,从而规模为N的问题分为一个规模为N-1的问题,即T(n) = T(n-1) + Θ(n),用递归树分析可得运行时间T(n) = O(n2)。

平均情况

假设规模为N的问题分为一个规模为9/10N的问题和规模为1/10N的问题,即T(n) = T(9n/10) + T(n/10) + Θ(n),用递归树分析可得T(n) = O(nlogn),而且比分区9:1要更平均(也就是情况更好)的概率为80%,所以在绝大部分情况下快速排序算法的运行时间为O(nlogn)。

这篇关于quick sort analyse的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/342424

相关文章

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

stl的sort和手写快排的运行效率哪个比较高?

STL的sort必然要比你自己写的快排要快,因为你自己手写一个这么复杂的sort,那就太闲了。STL的sort是尽量让复杂度维持在O(N log N)的,因此就有了各种的Hybrid sort algorithm。 题主你提到的先quicksort到一定深度之后就转为heapsort,这种是introsort。 每种STL实现使用的算法各有不同,GNU Standard C++ Lib

C/C++经典排序问题,sort函数使用

目录 1. 前言 2. 正文 2.1 问题 2.2 解决办法 2.2.1 思路 2.2.2 代码实现 2.2.3 测试结果 3. 备注 1. 前言 大家在学习C语言的时候,是不是经常被排序算法折磨的很难那首,其实都是但是在C++中有专门的,排序函数,而且支持自定义排序算法。下面我就带大家看看,sort函数简单的数组排序中的应用。 2. 正文 2.1 问题 题目描述

Hive中order by,sort by,distribute by,cluster by的区别

一:order by order by会对输入做全局排序,因此只有一个Reducer(多个Reducer无法保证全局有序),然而只有一个Reducer,会导致当输入规模较大时,消耗较长的计算时间。关于order by的详细介绍请参考这篇文章:Hive Order by操作。 二:sort by sort by不是全局排序,其在数据进入reducer前完成排序,因此,如果用sort

list.sort实现根据对象的属性值对集合进行排序

list.sort实现根据对象的属性值对集合进行排序,如下所示List<Map<String,Object>> list = new ArrayList<>();Map<String,Object> map1 = new HashMap<>();map1.put("gz_id",1);map1.put("aaa","aaa");Map<String,Object> map2 = new H

HDU 1890 Robotic Sort

题意: 将一列数字排序  排序规则是  每次找到最小值的位置loc  将1~loc所有数字颠倒  然后删掉第一位  直到排好序  排序要求是稳定的 思路: 这题要做的是  寻找区间最小值位置  翻转区间  的操作  因此可以想到用splay 只需要每个节点记录一个small  就可以实现找到最小值位置 翻转区间操作就是将splay的超级头转到最上面使之成为根  再把loc转到根下面

Go-Sort(Cont)

倒序。 package mainimport ("fmt""sort")func main() {data := []string{"one", "two", "three", "four"}sort.Strings(data)fmt.Println(data) //[four one three two]sort.Sort(sort.Reverse(sort.StringSlice(data

sort对二维字符数组排序

转载自(http://blog.csdn.net/unimen/article/details/6843977) 由于二维字符数组的第二维没有赋值运算符,即不能对整个一维数组进行赋值,因此是无法直接对二维数组用sort进行排序的,解决办法有二种: 代码一: #include <iostream> #include <cstring> #include <algorithm> usin

Insertion Sort Integer Array Insertion Sort Linked List

Sort Integer Array using Insertion sort. //********************************************************************************************************/* Insertion Sort 原理:就是前面的sort部分全部是相对值,从后面拿一个元素,然后跟

Merge Sort Array and Merge Sort Linked List

Merge Sort Array: 看完stanford的 CS106B的video,https://www.youtube.com/watch?v=LlNawf0JeF0&list=PLnfg8b9vdpLn9exZweTJx44CII1bYczuk&index=55 醍醐灌顶; public class Solution {/*** @param A: an integer array* @