快速排序
快排的代码难点一般在于停止循环的边界条件,这边给出一个不是从两边向中间遍历,而是单向遍历的代码,实现起来更加方便。
#include <ctime>
#include <cstdlib>
#include <algorithm>
using namespace std;
class Solution {
public:
vector<int> sortArray(vector<int>& nums) {
srand(time(0));
sort(nums, 0, nums.size() - 1);
return nums;
}
void sort(vector<int>& nums, int l, int r) { //对[l, r]进行排序
if (r - l < 1)
return;
int flag = rand() % (r - l + 1) + l;
swap(nums[flag], nums[r]); //将哨兵的值挪到右边
int i,j;
for (i = j = l; i < r; i++) { //i是遍历头,j是分隔处
if (nums[i] < nums[r]) { //保证小于哨兵的都在j的左边,j及j向右>=哨兵
swap(nums[j], nums[i]);
j++;
}
}
swap(nums[j], nums[r]);
sort(nums, l, j - 1);
sort(nums, j + 1, r);
}
};