快速排序(四)

三路快速排序:思想就是将一块数据分为三个部分,分别为<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);
}

 

转载于:https://www.cnblogs.com/bohat/p/8671877.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值