快速排序的两种实现方法

快速排序有很多实现方法,主要的有两种,总结一下:

第一种:

设置左右两个指针,low,high,设置枢纽记录当前比较对象temp,然后首先从高位置high向前搜索找到第一个比temp小的数,然后放到low位置,再找再从low位置开始向后找比temp大的数,再放到high位置,直到low==high。最后把temp放到low位子上。一遍快排完成。这样结束后数组low的左边的数都比low小于或等于,右边的数大于或等于。然后再递归快排左右两个子区间。

int solve(int* a,int low,int high)
{
    int temp=a[low];
    while(low<high){
        while(low<high&&a[high]>=temp)high--;
        a[low]=a[high];
        while(low<high&&a[low]<=temp)low++;
        a[high]=a[low];
    }
    a[low]=temp;
    return low;
}
int QuickSort(int* a,int low,int high)
{
    if(low<high){
        int mid=solve(a,low,high);
        QuickSort(a,low,mid-1);
        QuickSort(a,mid+1,high);
    }
}

第二种:

同样把最左边一个设置一个枢轴(就是比较对象),然后设置两个指针,temp,i,这两个指针不会像上面那样,一个向前扫,一个向后扫,而是都是向后扫描,其中i逐步向后移动,把当前的数和枢轴比较(就是a[low]),如果比他大或者相等,继续移动,否则,跟temp位置的数交换,然后temp和i都++,可以看出,从temp往前的数都是比a[low],小的,往后的数都是比a[low],大的,这样扫描完一次后,也可以分成左右两个子区间,在递归快排就好了。

int Partition(int *a,int low,int high)
{
    if(low<=high){
        int temp=low;
        for(int i=low+1;i<=high;i++){
            if(a[i]<=a[low]){
                swap(a[temp+1],a[i]);
                ++temp;
            }
        }
        swap(a[low],a[temp]);
        return temp;
    }
}
int QuickSort(int* a,int low,int high)
{
    if(low<high){
        int mid=Partition(a,low,high);
        QuickSort(a,low,mid-1);
        QuickSort(a,mid+1,high);
    }
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值