1.荷兰国旗问题:数组只包含0,1,2对其排序
(1)首先最简单的就是计数排序,当然这里不讨论,一般情况下考察的都不是这个
(2)和快排划分过程相似:时间O(n),空间O(1)。
快排划分的时候有个标志位 i=left-1,如果a[j]>x,j++,i++否则j++,i++,a[j] a[i]互换位置.而该题目可以设置两个标志位,i,j,一个在最左边一个在最右边。对于数组a[0~n-1],初始i=0,j=n;
遍历元素和1比较:
1)如果=1,直接k++,考察下一个数
2)如果=0,左边标志位i++,a[k]a[i]进行交换,考察下一个数
3)如果=2,右边标志位j–,a[k][j]交换,注意这里不能直接考察下一个数,要在对a[k]与1进行比较,a[j]可能是0 1 或者2,所以此时只要将当前位置k不变在做一次比较即可。
4)直到当前位置k和右边标记j相同时,停止
[0,1,1,0,2,2],6
返回:[0,0,1,1,2,2]
public class ThreeColor {
public int[] sortThreeColor(int[] a, int n) {
// write code here
int i=-1;
int j=n;
for(int k=0;k<j;k++){
if(a[k]==1) continue;
if(a[k]==0){
i++;
int temp=a[i];
a[i]=a[k];
a[k]=temp;
continue;
}
if(a[k]==2){
j--;
int temp=a[j];
a[j]=a[k];
a[k]=temp;
k--;
}
}
return a;
}
}