一個數組中只有0,1,2三個元素,進行排序,要求時間複雜度爲O(n)


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

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