该题的解法有桶排序和三向切分快排,因为其存在大量的重复元素,所以三向切分快排很适合
- 桶排序
class Solution {
public:
void sortColors(vector<int>& nums) {
map<int, int> m;
for (int i = 0; i < nums.size(); ++i) {
++m[nums[i]];
}
nums.clear();
for (map<int, int>::iterator iter = m.begin(); iter != m.end(); ++iter) {
for (int i = 0; i < iter->second; ++i) {
nums.push_back(iter->first);
}
}
}
};
- 三项切分快排(原理在上一篇博文中https://blog.csdn.net/qqzxoe/article/details/102973086)
class Solution {
public:
void swap(vector<int>& nums, int i, int j)
{
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
void quik3WaySort(vector<int>& nums, int low, int high)
{
if (low >= high) {
return;
}
int lt = low;
int gt = high;
int mid = low + 1;
int key = nums[low];
while (mid <= gt) {
if (nums[mid] < key) {
swap(nums, mid++, lt++);
} else if (nums[mid] > key) {
swap(nums, mid, gt--);
} else {
++mid;
}
}
quik3WaySort(nums, low, lt - 1);
quik3WaySort(nums, gt + 1, high);
}
void sortColors(vector<int>& nums) {
quik3WaySort(nums, 0, nums.size() - 1);
}
};