性能:
快速排序的最坏时间为O(n2),平均时间复杂度为O(nlgn)。
算法导论对快速排序的描述是:
分解:数组A[p..r] 被划分为两个(可能为空)子数组A[p..q-1]和A[q+1..r],使得A[p..p-1]的每个元素小于等于A[q],而A[q]也小于等于[q+q..r]中的每个元素。
解决:通过递归调用快速排序,对子数组A[p..q-1]和A[q+1..r]进行排序。
合并:因为子数组都是原址排序,所以不需要合并操作:数组A[p..r]已经有序。
即,利用分治思想对数组A[p..r]进行划分成子数组A[p..q-1]和A[q+1..r],
且通过与基数比较使得A[p..q-1]小于基数,A[q+1 ..r] 大于基数,
直至子数组中元素个数为1,则完成快速排序。
简单例子,对下列数组进行快速排序:
96 | 20 | 60 | 33 | 72 | 2 | 42 | 57 | 22 | 50 |
以最后一个元素为基数则排序如下, 表示q指示的位置, 表示当前比较到的位置, 表示与q交换后的位置
-> 96 20 60 33 72 02 42 57 22 50 从 第一个元素开始比较, 96大于50 此时没有移动 q = 0 -> 20 96 60 33 72 02 42 57 22 50 从 第一个元素开始比较,20小于50往前移。 20与q上的数字90交换,交换后q=1
-> 20 96 60 33 72 02 42 57 22 50
-> 20 33 60 96 72 02 42 57 22 50
-> 20 33 60 96 72 02 42 57 22 50
-> 20 33 02 96 72 60 42 57 22 50
-> 20 33 02 42 72 60 96 57 22 50
-> 20 33 02 42 72 60 96 57 22 50
-> 20 33 02 42 22 60 96 57 72 50
-> 20 33 02 42 22 50 96 57 72 60
这样 0-5 小于50 ,6-9大于50。
分成如下2个数组
A[p .. q-1] 数组如下
20 | 33 | 02 | 42 | 22 | 50 |
A[q+1 .. r] 数组如下
92 | 56 | 72 | 60 |
分别对2个数组继续分解划分即可完成排序
代码如下:
int Partition(int* A,int p,int r) { int x = A[r]; // 基数 int q =p; for(int j=p;j<r;++j) { if(A[j] <=x) { int temp = A[q]; A[q] = A[j]; A[j] =temp; ++q; } } q=(q-1<p)?p:q-1; return q; } // 快速排序 void Quicksort(int* A,int p,int r) { if(p<r) { int q = Partition(A,p,r); Quicksort(A,p,q-1); Quicksort(A,p+1,r); } }
原文:http://www.cnblogs.com/stratrail/p/5027899.html