快速排序,对于n个数的输入数组,最坏情况运行时间:Θ(n^2);期望运行时间:Θ(nlgn);就地排序(Sort in place)。
数组A[p..r]会被分为两个子数组A[p..q-1]和A[q+1..r],其中A[p..q-1]的元素都不大于A[q],A[q+1..r]都不小于A[q]。
如何划分子数组对运行时间的有很大影响,最坏的情况为n个数的数组划分为一个n-1的数组和一个0元素的数组;最佳情况为对半分(1:1);对于平均情况的划分,其运行时间与最佳情况很接近。
先看代码实现:
快速排序的关键是数组划分,对子数组进行就地重排。
1 /* 2 * 调用划分函数,使得子数组顺序重排 3 */ 4 void quick_sort(int A[], int p, int r){ 5 if(p < r){ 6 int q = partition(A, p, r); 7 quick_sort(A, p, q-1); 8 quick_sort(A, q+1, r); 9 } 10 } 11 12 /* 13 * 对于比x值小的元素通过交换放置到小于x值的区域。 14 * 最后将大于x值的区域的第一个元素与x值,即原A[r],交换 15 * 该下标即为q,形成两个符合要求的数组(A[p..q-1]的元素都不大于A[q],A[q+1..r]都不小于A[q]) 16 */ 17 int partition(int A[], int p, int r){ 18 int x = A[r]; 19 int i = p - 1; 20 int j; 21 for(j = p; j <= r-1; j++){ 22 if(A[j] <= x){ 23 i++; 24 int temp = A[i]; 25 A[i] = A[j]; 26 A[j] = temp; 27 } 28 } 29 int temp = A[i+1]; 30 A[i+1] = A[r]; 31 A[r] = temp; 32 return i+1; 33 }