Sort Colors
Given an array with n objects colored red, white or blue, sort them in-place so that objects of the same color are adjacent, with the colors in the order red, white and blue.
Example:
Input: [2,0,2,1,1,0]
Output: [0,0,1,1,2,2]
Here, we will use the integers 0, 1, and 2 to represent the color red, white, and blue respectively.
Note: You are not suppose to use the library’s sort function for this problem.
这道题,拿到手第一想法是计数排序,反正就只有三个数,直接定义一个大小为三的数组就ok,这是一个比较简单的思路,也非常容易实现。后来看了一些大牛的算法视频之后,提出了三路快排的思想来解决这个问题,三路快排也就是快排的思想。
首先,定义三个指向,第一个是指向z = 0,第二个是个游标 i,第三个是指向数组的末尾 e = nums.length-1。游标从0开始,遇到元素1的话,就继续向前,遇到元素0的话,和nums[z]交换位置,z向前移动,i也继续向前,遇到2的话,和nums[e]交换位置,e - -,思想是不断把2换到后面,0换到前面,1的位置就让他留在中间。
代码如下:
class Solution {
public void sortColors(int[] nums) {
int z = 0; //指向元素0
int e = nums.length-1; //指向元素2
int i = 0; // 游标
while(i <= e){
if(nums[i] == 1)
i++; // 遇到1 直接继续向前
else if(nums[i] == 0){ //遇到0 交换 位置
int t = nums[i];
nums[i] = nums[z];
nums[z] = t;
z++;
i++; // 关于这里为什么i++,下面解释
}else{ // 遇到2 交换位置
int t = nums[i];
nums[i] = nums[e];
nums[e] = t;
e--; //为什么这里 i 不需要++
}
}
}
}
针对上面的两个问题,首先回答为什么 i++,这里需要注意的是,我们的游标是从前面来的,前面的元素是处理好的,是有序的,不需要再次处理,所以可以继续向前推动,而后面i 为什么不需要++,这里的道理是和前面的相同的情况,后面的元素游标没有处理到,假设,后面的元素是2,被换到了前面,而游标继续向前推动,就乱序了,正确的做法是游标停在当前的位置,继续处理这个被换下来的2,直到有序为止。
我们针对上面的例子进行手推,如果i不++的话,那么我们i将永远处于索引为0的位置,而z不断向前,这样明显是和我们的预期是不符合的,所以,这里必须要进行i++操作。
ok,问题到此结束。。。。。