题目描述:
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
注意:
不能使用代码库中的排序函数来解决这道题。
解题思路:初始想法就是排序就能解决了,但是题目要求需要常数空间和一趟扫描。
所以就想到可以使用快速排序的思想,将大于1的放左边,小于1的放右边就可以了。
也就是采用双指针,左右指针,当左指针的值大于1,右指针的值小于1,交换这两个数。
比如:[2,0,2,1,1,0] 一次排序后为[0,0,2,1,1,2]
在对右边进行排序后:[0,0,1,1,2,2]
代码:
//采用快速排序的思想,将大于1的放左边,小于1的放右边
public static void sortColors(int[] nums) {
//对所有进行排序
int l = 0;
int r = nums.length-1;
while(l < r) {
while(l<r && nums[l]<1)
l++;
while(l<r &&nums[r]>1)
r--;
if(l<r) {
int temp = nums[l];
nums[l] = nums[r];
nums[r] = temp;
l++;
r--;
}
}
//再对左边进行排序
int index = l;
r = index;
l = 0;
while(l < r) {
while(l<r &&nums[l]<1)
l++;
while(l<r &&nums[r]>=1)
r--;
if(l<r) {
int temp = nums[l];
nums[l] = nums[r];
nums[r] = temp;
l++;
r--;
}
}
//对右边进行排序
l = index;
r = nums.length-1;
while(l < r) {
while(l<r &&nums[l]<=1)
l++;
while(l<r &&nums[r]>1)
r--;
if(l<r) {
int temp = nums[l];
nums[l] = nums[r];
nums[r] = temp;
l++;
r--;
}
}
System.out.println(Arrays.toString(nums));
}