荷蘭國旗問題

問題描述:

給定一整型數組array和一整型值num,完成對array的排序,要求大於num的放後面,小於num的放前面,等於num的放中間,並且要求時間複雜度O(N),空間複雜度O(1)

算法思路:

定義兩個指針記做pLeft,pRight。pleft表示左邊最後一個元素的下標,pRight表示右邊第一個元素的下標。遍歷數組,array[p]時,需保證0 -- pLeft 之間所有元素均小於num,pLeft+1 -- p 之間所有元素均等於num ,pRight -- N所有元素均大於num。如此隨着p向後移動,即可完成排序。

具體實現見代碼:

     public static void hollandFlag(int[] array,int num) {
         int p = 0,pLeft = -1,pRight = array.length;
         while(p < pRight) {
             if(array[p] < num) {
                 swap(array,p++,++pLeft);
             }else if(array[p] > num) {
                 swap(array,p,--pRight);
             }else {
                 p++;
             }
         }
     }
     public static void swap(int[] array,int i,int j) {
         int temp = array[i];
         array[i] = array[j];
         array[j] = temp;
     }

注:

array[p] > num時,爲何不能移動p指針?

若p同array[p] < num一樣也往後移動指針,會忽略如下情況:交換之後的array[p]值依然大於num,如果接着移動p會使得之前的大於num的值混跡到num之中,(反例 array [515389] num =3)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章