题目:
这个题目可以使用双指针来进行解决。第一种方式是与冒泡排序类似的用快慢双指针实现的方式,另一种是使用对撞指针的方式来实现。
方式1:
我们对数组进行两次遍历,第一次遍历我们将数组中的0移动到数组的头部,并保留一下此时左指针的位置;第二次遍历将1逐次放到0的后面
代码实现:
public static void sortColors1(int[] ints){
int len = ints.length;
int left = 0;
for (int right=0;right<len;right++){
if (ints[right]==0){
int temp =ints[left];
ints[left] =ints[right];
ints[right]=temp;
left++;
}
}
for (int right=left;right<len;right++){
if (ints[right]==1){
int temp =ints[left];
ints[left] =ints[right];
ints[right]=temp;
left++;
}
}
}
方式2:
与方式1相比,在这个方法里面我们多了一个指针,总共是3个指针。但是并不难理解,反而看完之后会觉得很巧妙。对数组进行遍历,如果是0就和左指针进行交换,如果是2就和右指针进行交换。与方式1相比这里的效率更高,因为只对数组进行了一次遍历。方式1对数组进行了两次遍历。
public static void sortColors2(int[] ints){
int left = 0;int right = ints.length-1;
int index = 0;
while (index<=right){
if (ints[index]==0){
swap(ints,index++,left++);
}else if (ints[index]==2){
swap(ints,index++,right--);
}else {
index++;
}
}
}