快速排序
快速排序是一种十分优雅和十分实际有效的算法。
快速排序和归并排序一样,也是一种用递归的算法。归并排序的基本递归操作是合并两个已经排好序的数组,而快速排序的基本递归操作是Partition,当然这个也是快速排序算法的核心,输入一个未排序的数组,选择其中一个元素,如何将它插入到数组中的某个位置,使得这个位置之前的所有元素都小于这个插入的元素,这个位置之后的元素都大于这个待插入的元素,简单来说,把待插入的元素放在排好序之后期望的正确位置上。
快速排序算法的划分,也就是Partition使用了交换和一个优雅的扫描模型:
使用两个游标i,j
A[0...i]表示小于x的元素,[i+1...j-1]表示大于x的元素,而[j...size-1]为待探查的元素,如果发现下一个待探查的元素大于x则什么也不做,因为这个元素正好继续加入到大于x的元素行列中,如果小于x,这个时候使用交换此时的A[j]和A[i+1],如此扫描到最后,再进行最后一次交换,将待插入的元素交换到中间的位置即可。
下面参见测试代码:
View Code
/** * algorithm name: quick sort * implemented by: ivan jobs * date: 2012.5.1 * email: ivan1377@163.com */ #include <cstdio> int Partition(int a[], int p, int r){ int x = a[r]; int i = p-1; int j; for(j=p;j<=r-1;j++){ if(a[j] <= x){ i++; int tmp = a[i]; a[i] = a[j]; a[j] = tmp; } } int tmp = a[i+1]; a[i+1] = a[r]; a[r] = tmp; return i+1; } void QuickSort(int a[],int p,int r){ if(p<r){ int q = Partition(a, p, r); QuickSort(a, p, q-1); QuickSort(a, q+1, r); } } int main(){ int a[] = {2, 5, 3, 1, 9, 7, 8, 6, 4}; QuickSort(a, 0, 8); int i; for(i=0;i<9;++i) printf("%d ", a[i]); printf("\n"); return 0; }
不妥之处,欢迎指正:)