快排
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]);