1. 程式人生 > >荷蘭國旗/三色排序

荷蘭國旗/三色排序

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