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];
    }
}

 

 

posted @ 2013-06-30 00:21  一只会思考的猪  阅读(217)  评论(0编辑  收藏  举报