1、计数排序
计数排序是一种特殊的排序,他要求数组中的值都落在一定的范围内,以具体的值作为键值,记录每一个值出现的次数,而后直接按照出现次数输出排序后的数组。计数排序以额外空间为代价,能够实现 O ( n + k ) O(n+k) O(n+k)的时间复杂度,其中k表示值的个数。
class Solution {
public:
void sortColors(vector<int> &nums) {
int red_times = 0, white_times = 0, blue_times = 0;
for (auto i: nums) {
switch (i) {
case 0:
++red_times;
break;
case 1:
++white_times;
break;
case 2:
++blue_times;
break;
}
}
for (int i = 0; i < red_times; ++i) {
nums[i] = 0;
}
for (int i = red_times; i < red_times + white_times; ++i) {
nums[i] = 1;
}
for (int i = red_times + white_times; i < nums.size(); ++i) {
nums[i] = 2;
}
}
};
2、双指针
左指针从左向右查找为0的位置,右指针从右向左查找为2的位置,一旦查找到则与当前位置i上面的数字进行交换。
class Solution {
public:
void sortColors(vector<int>& nums) {
int n = nums.size();
int p0 = 0, p2 = n - 1;
for (int i = 0; i <= p2; ++i) {
while (i <= p2 && nums[i] == 2) {
swap(nums[i], nums[p2]);
--p2;
}
if (nums[i] == 0) {
swap(nums[i], nums[p0]);
++p0;
}
}
}
};