問題描述:
給定一整型數組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)