快速排序——C++

快速排序:将序列划分成两个部分,前一部分的值都小于后一部分,然后递归的调用两部分序列进行排序,一分二,二分四;关键是如何划分;

我们定义函数 randomized_quicksort(nums, l, r) 为对 nums 数组里 

[l,r] 的部分进行排序,每次先调用 randomized_partition(nums,l,r) 函数对 nums 数组里 

[l,r] 的部分进行划分,并返回分界值的下标 pos,然后按上述将的递归调用 randomized_quicksort(nums, l, pos - 1) 和 randomized_quicksort(nums, pos + 1, r) 即可。

关键在于划分函数的实现:选定一个值(数组里任意一个值),大于它的在一组,小于他的在另一组,其实挺简单的,为了方便我们都选取序列最后一个元素作为选定值;

class Solution {
public:

int partition(vector<int>&nums,int l,int r)
{
        int povit=nums[r];
        int i=l-1;
        int j=l;
        for(j=l;j<r;j++)
        {
            if(nums[j]<povit)
            {
                i++;
                swap(nums[i],nums[j]);
            }
        }

        swap(nums[i+1],nums[r]);
        return i+1;
}

int partition_random(vector<int>&nums,int l,int r)
{
        int i=rand()%(r - l + 1) + l;
        swap(nums[r],nums[i]);
        return partition(nums,l,r);

}

void sort_quick(vector<int>&nums,int l,int r)
{
if(l<r)
{
    int pos=partition_random(nums,l,r);
    sort_quick(nums,l,pos-1);
    sort_quick(nums,pos,r);
}
}
    vector<int> sortArray(vector<int>& nums) {
            srand((unsigned)time(NULL));
            sort_quick(nums,0,nums.size()-1);
            return nums;
    }
};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值