荷兰国旗/三色排序

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;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_32534441/article/details/88767988