快排
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)
所以想用快排的话,这题在调用快排之前需要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解决分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/33167.html