题目描述:
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。
此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。
解题思路:
本题实际上就是对只有三个变量的数组进行排序,其中数字0尽量在数组最左边;数字1尽量在数组最右边。
这里设置三个指针,left,right,和index。
left的含义是:在left左边的部分(不包括left)都是0
right的含义是:在right的右边的部分(不包括right)都是2
index:在区间[left,right]中间寻找不为1的数,若是0就与left交换,若是2就与right交换。每次交换完就右移left或左移right确保left左边都是0,right右边都是2。当left与right重叠,或是right与index重叠时,排序结束。
代码如下:
public void sortColors(int[] nums) {
if(nums.length==1) return;
int left=0;//left左边部分均为0
int right=nums.length-1;//right右边部分均为2
int index=left;
while (index<=right){
while (nums[left]==0){
left++;
index=left;
if(left==right) return;
}
while (nums[right]==2){
right--;
if(left==right) return;
}
if(nums[index]==0){
change(nums,index,left);
}else if(nums[index]==2){
change(nums,index,right);
}else {
index++;
}
}
}
private void change(int[] nums, int index, int left) {
int temp=nums[index];
nums[index]=nums[left];
nums[left]=temp;
}