快排
O ( n l o g n ) O(nlogn) O(nlogn)
class Solution {
public:
void sortColors(vector<int>& nums) {
sort(nums.begin(), nums.end());
}
};
计数排序
O ( n ) O(n) O(n)
class Solution {
public:
void sortColors(vector<int>& nums) {
int count[3]={0};
for(const auto &it: nums) count[it]++;
int idx = 0;
for(int i = 0; i < count[0]; i++){
nums[idx++] = 0;
}
for(int i = 0; i < count[1]; i++){
nums[idx++] = 1;
}
for(int i = 0; i < count[2]; i++){
nums[idx++] = 2;
}
}
};
三路快排(荷兰国旗问题)
class Solution {
public:
void sortColors(vector<int>& nums) {
int l = -1, r = nums.size();
for(int i = 0; i < r; ){
if(nums[i] == 1) i++;
else if(nums[i] == 2){
r--;
swap(nums[r], nums[i]);
}else{
l++;
swap(nums[l], nums[i]);
i++;
}
}
}
};
荷兰国旗
class Solution {
public:
void sortColors(int A[], int n) {
int l = -1;
int r = n;
int i = 0;
while(i < r){
if(A[i] == 0){
swap(A[++l], A[i++]); //因为从前面交换过来的是1 所以i要加加
}else if(A[i] == 2){
swap(A[--r], A[i]); //而从后面换过来的数还不确定 所以i暂时不动 要到下一层循环继续判断
}else i++;
}
}
};