快速排序(四)

三路快速排序:思想就是将一块数据分为三个部分,分别为<v,=v,>v三部分。5个下标值。l:为左下标值 r:为右下标值 lt:为<v的边界下标 gt:为>v的边界下标。i:为检索值

1:当arr[i]>v时,将arr[i]的值和arr[gt-1]的值进行互换,此时i处的值同样的还没有被处理过。gt=gt-1

2:当arr[i]<v时,将arr[i]的值和arr[lt+1]的值进行互换。此时lt=lt+1;i=i+1;

3:当arr[i]=v时,不做任何处理,直接将i=i+1;

template <typename T>
void __qiuckSort3(T arr[],int l,int r)
{
    if(r-l<=15) {
        insertinonSort(arr, l, r);
        return;
    }
    // partition
    swap(arr[l],arr[rand()%(r-l+1)+l]);
    T v=arr[l];

    int lt=l; //arr[l+1..lt)<v
    int gt=r+1; //arr(gt..r]>v
    int i=l+1; //arr[lt+1..i) == v
    while(i<gt)
    {
       if(arr[i]<v && i<=r ){
           swap(arr[i],arr[lt+1]);
            i++;
            lt++;
        }
        else if(arr[i]>v)
       {
            swap(arr[i],arr[gt-1]);
            gt--;
        }
        else {
           i++;
       }
    }
    swap(arr[l],arr[lt]);
    __qiuckSort3(arr,l,lt-1);
    __qiuckSort3(arr,gt,r);
}
template <typename T>
void qiuckSort3(T arr[],int n)
{
    srand(time(NULL));
    __qiuckSort3(arr,0,n-1);
}

 

posted @ 2018-03-29 19:26  boht  阅读(113)  评论(0编辑  收藏  举报