荷兰国旗/三色排序

来源:互联网 发布:网络协议的组成要素 编辑:程序博客网 时间:2024/04/28 16:12

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