快排被卡random_shuffle解决

快排被卡random_shuffle解决快排classSolution{public:voidqksort(vector<int>&nums,intleft,intright){//对nums数组[left,right]段数据排序if(left>=right)//越界,返回baselinereturn;intlow=left,high=right;intkey=nums

对数组排序

快排

class Solution { 
   
public:
    void qksort(vector<int> &nums, int left, int right){ 
   
        //对nums数组[left, right]段数据排序
        if(left >= right)//越界,返回 baseline
            return;
        int low = left, high = right;
        int key = nums[low];//哨兵
        while(low < high){ 
   
            while(low < high && nums[high] >= key)//从后往前找,找到第一个小于哨兵的值
                high--;
            nums[low] = nums[high];//小于哨兵的放哨兵的前面
            while(low < high && nums[low] <= key)//从前往后找,找到第一个大于哨兵的值
                low++;
            nums[high] = nums[low];//大于哨兵的放后面
        }
        nums[low] = key;//最后剩下一个位置是哨兵的位置
        qksort(nums, low+1, right);//对哨兵前面的数组排序
        qksort(nums, left, high-1);//对哨兵后面的数组排序
    }
    vector<int> sortArray(vector<int>& nums) { 
   
        qksort(nums, 0, nums.size()-1);
        return nums;
    }
};

但是会被卡,众所周知快排最坏情况下(逆序)会退化成冒泡排序 O ( n 2 ) O(n^2) O(n2)
image.png

所以想用快排的话,这题在调用快排之前需要random_shuffle一下(在ykf巨巨的指导下学会了random_shuffle洗牌)

std::srand(unsigned(time(0)));//初始化随机数种子
std::random_shuffle(vector.begin(), vector.end());

它的时间复杂度是 O ( n ) O(n) O(n)

它的内部实现:

for(int i=0;i<n;i++)
swap(a[i],a[rand()%n]);

今天的文章快排被卡random_shuffle解决分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:http://bianchenghao.cn/33167.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注