1.設置三個標記指針,pos0,pos2,pcur
2.令pos0從前往後遍歷,指向第一個非0的位置,pos2從後往前遍歷,指向第一個非2的位置
3.然後pcur從pos0開始往後遍歷:
遇到0就和pos0交換,pos0++;
遇到1什麼也不做;
遇到2就和pos2交換,pos2向前滑動到下一個非2的位置,交換後還要重新檢查pcur的值,爲0就繼續pos0交換,pos0++;
直到cur與pos2相遇。
一次遍歷,複雜度是O(n),因爲每次操作都使得數組更爲有序,不像快排需要重複比較,所以比應用快排的方法效率高一些。
具體代碼實現:
int main(){
int arr[14] = {0,1,2,1,2,0,2,0,1,2,2,2,1,2};
int pos0=0, pos2=sizeof(arr)/4 -1, pcur=0;
while(0 == arr[pos0])
++pos0;
while(2 == arr[pos2])
--pos2;
pcur = pos0;
while(pcur <= pos2){
if(0 == arr[pcur]){
swap(arr[pcur], arr[pos0]);
++pos0;
}
else if(2 == arr[pcur]){
swap(arr[pcur], arr[pos2]);
if(0 == arr[pcur]){//若交換之後,pcur當前指向的元素爲0,則繼續將pcur指向的元素和pos0指向的元素進行交換
swap(arr[pcur], arr[pos0]);
++pos0;//交換之後,將pos0向前移動一位
}
--pos2;//pos2向後移動一位
while(arr[pos2] == 2)//若移動之後指向的元素還是2,則繼續向前移動,直到指向第一個非2的元素
--pos2;
}
++pcur;//將pcur向前移動
}
//將原數組打印出來
for(int i =0;i < sizeof(arr)/4;++i)
cout<<arr[i]<<" ";
cout<<endl;
return 0;
}