注:本文章只做个人记录
相关题目:
1.经典随机快速排序
class Solution {
public:
vector<int> sortArray(vector<int>& nums) {
int len = nums.size();
mySort(nums, 0, len - 1);
return nums;
}
void mySort(vector<int>& nums, int l, int r){
if(l >= r){
return;
}
int len = r - l + 1;
int x = nums[l + (rand() % len)];
int xi = partition(nums, l, r, x);
mySort(nums, l, xi - 1);
mySort(nums, xi + 1, r);
}
int partition(vector<int>& nums, int l, int r, int x){
int xi = 0;
int a = l;
for(int i = l; i <= r; i++){
if(nums[i] <= x){
swap(a, i, nums);
if(nums[a] == x){
xi = a;
}
a++;
}
}
swap(xi, a - 1, nums);
return a - 1;
}
void swap(int a, int i, vector<int>& nums){
int temp = nums[a];
nums[a] = nums[i];
nums[i] = temp;
}
};
2.荷兰国旗问题优化随机快速排序
class Solution {
public:
vector<int> sortArray(vector<int>& nums) {
int len = nums.size();
mySort(nums, 0, len - 1);
return nums;
}
void mySort(vector<int>& nums, int l, int r){
if(l >= r){
return;
}
int len = r - l + 1;
int x = nums[l + (rand() % len)];
auto limit = partition(nums, l, r, x);
mySort(nums, l, limit.first); //l....limit.first
mySort(nums, limit.second, r); //limit.second......r
}
pair<int, int> partition(vector<int>& nums, int l, int r, int x){
int a = l;
int b = r;
for(int i = l; i <= b; i++){
if(nums[i] < x){
swap(a, i, nums);
a++;
continue;
}
if(nums[i] > x){
swap(b, i, nums);
b--;
i--; //配合循环,使i留在原地
continue;
}
}
return {a - 1, b + 1};
}
void swap(int a, int i, vector<int>& nums){
int temp = nums[a];
nums[a] = nums[i];
nums[i] = temp;
}
};