QuickSort Again
MIT的算法课,看到一个很新颖的Partition的方法,代码很简洁,在也不用判断几个边界(original i<=j or i<j)。直接上代码:
#include <iostream> #include <algorithm> using namespace std; //Partition a[begin,end) /** [p| <=x | x | >= x | unknow ] i j 6 10 13 5 8 3 2 || x=6 i j j if ok 6 5 13 10 8 3 2 i j <- next round j if ok 6 5 3 10 8 13 2 i j if ok 6 5 3 2 8 13 10 i j for OK last exchange 2 5 3 6 8 13 10 <=x x >=x MIT 算法导论课的Partition算法 Partition(A,p,q) //A[p,q] x = X[p]; i = p; for(j = p+1; j <= q; j++){ if (A[j] <= x){ i++; swap(a[i],a[j]); } } swap(a[p],a[i]); 这个算法的好处是,不用考虑两边走的时候 边界条件的问题,这里没有边界条件 */ //A[p,q) int Partition(int * A, int p, int q){ int x = A[p]; int i = p; for(int j = p+1; j <= q; j++){ if (A[j] <= x){ i++; swap(A[i],A[j]); } } swap(A[p],A[i]); return i; } void QuickSort(int *A, int begin, int end){ if (begin > end){ return; } int pivot = begin + (end - begin)/2; swap(A[pivot],A[begin]); int i = Partition(A,begin,end); QuickSort(A,begin,i-1); QuickSort(A,i+1,end); } using namespace std; int main(int argc, char *argv[]) { int a[] = {6,10,13,5,8,3,2,6}; QuickSort(a,0,7); for(int i = 0; i < 8; i++){ cout << " " << a[i]; } }