荷蘭國旗/三色排序
阿新 • • 發佈:2019-02-15
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; } }