给定一个n个对象颜色为红色,白色或蓝色的数组,对其进行排序,使相同颜色的对象相邻,颜色为红色,白色和蓝色。
在这里,我们将使用0,1和2的整数分别表示红色,白色和蓝色。
优化前的思路及代码:
class Solution {
public void sortColors(int[] nums) {
//时间复杂度:O(n)空间复杂度:O(1)
int[] count = {0,0,0};//存放0,1,2三个元素的出现频率
for(int num : nums){
if(num >= 0 && num <= 2)//确保数组中元素的值都为0,1,2
count[num]++;
else
System.out.println("您输入的数组元素有误");
}
int index = 0;//原来数组的下标,重新排序
int j = 0;//数组中的元素
while(j < count.length){
for(int i = 0;i<count[j];i++){
nums[index++] = j;
}
j++;
}
}
}
参考三路快排后的思路及代码:
class Solution {
public void sortColors(int[] nums) {
//时间复杂度:O(n)空间复杂度:O(1)[只遍历一遍完成题目的要求]
int zero = -1; //nums[0...zero] == 0;
int two = nums.length; //nums[two,n-1] == 2;
for(int i = 0;i < two;){
if(nums[i]==1) {
i++;
}else if(nums[i] == 2) {
//two--;
int temp = nums[i];
nums[i] = nums[--two];
nums[two] = temp;
}else {
if(nums[i] == 0){
//zero++;
int tmp = nums[++zero];
nums[zero] = nums[i];
nums[i] = tmp;
i++;
}else{
System.out.println("您输入的数组的数据有误!!!");
}
}
}
}
}