實現只有0,1,2三種元素的亂序數組的排序


待補充

題目:一個數組中只有0,1,2三種元素,要求對這樣的數組進行排序。

1.思路:

1.1思路1:

  第一眼看到這樣的題目,會舉得非常簡單,只需要兩次遍歷數組就可以完成了。第一次遍歷,掃描數組中的元素,每次遇到0則count0++,遇到1則count1++,遇到2則count2++,這樣一趟下來就能夠統計出數組中0,1,2的個數了。然后第二次遍歷的時候,只需要對數組進行重新賦值就可以了,從頭開始賦值count0個0,count1個1,count2個2。最終完成對數組的排序。

1.2思路2:

  既然是面試題,那么肯定不會讓你這么簡單就解決出來了的。面試官說,加入只能進行一次遍歷怎么辦,然后你就不知道了。

  這道題目如果只能進行一次遍歷,我們肯定會想到使用多指針。這種題目之前碰到過很多。類似折半查找需要設置兩個指針,不過這道題目卻需要三個指針,分別指向數組中0,1,2三個元素末尾。加入有排好序的數組{0,0,1,1,2,2},那么p0指向下標為1的那個0,p1指向下標為3的那個1,而p2則指向下標為5的那個2。

p0和p1從前往后掃描,p2從后往前掃描,

初始化時:

p0指向第一個非0元素,那么arry[p0]=1||2

p1指向第一個非1元素,那么arry[p1]=0||2

p2指向第一個非2元素,那么arry[p2]=0||1

假如:

arry[p0]==2,arry[p2]==0,交換兩個元素

arry[p1]==2,arry[p2]==1,交換兩個元素

arry[p0]==1,arry[p1]==0,交換兩個元素

否則的話只可能是p0,p1,p2指向的三個數各不相同,那么進行如下賦值

arry[p0]==0,arry[p1]==1,arry[p2]==2。

假如經過上述swap以后出現i>k的情況,將k=i。(PS:2012-10-5)

2.代碼示例

View Code
#include<iostream>
#include<stdlib.h>
using namespace std;

void PrintArry(int arry[],int len)
{
    for(int i=0;i<len;i++)
        cout<<arry[i]<<" ";
    cout<<endl;
}

void swap(int arry[],int i,int j)
{
    int temp=arry[i];
    arry[i]=arry[j];
    arry[j]=temp;
}

void sort(int arry[],int len)
{

    int i= 0;//頭指針指向0
    int j = len - 1;//尾指針指向2
    int k = 0;//中間指針指向1
    while(i <= j && k <= j && i <= k)
    {
        //i指向第一個非0值
        while(arry[i] == 0){
            i++;
        }
        //k指向第一個非1值
        while(arry[k] == 1){
            k++;
        }
        //j指向第一個非2值
        while(arry[j] == 2){
            j--;
        }

        if(i <= j && arry[j] == 0 && arry[i] == 2){
            swap(arry,i,j);
            i++;
            j--;
        }

        else if(k <= j && arry[k] == 2 && arry[j] == 1){
            swap(arry,k,j);
            k++;
            j--;
        }

        else if(i <= k && arry[k] == 0 && arry[i] == 1){
            swap(arry,k,i);
            i++;
            k++;
        }

        else if(i < k && k < j){
            arry[i] = 0;
            arry[k] = 1;
            arry[j] = 2;
            i++;
            k++;
            j--;
        }

        if(i>k)
        {
            k=i;
        }
    } 
}

void main()
{
    int arry[]={1,0,2,2,0,1,0,1};
    int len=sizeof(arry)/sizeof(int);

    PrintArry(arry,len);
    sort(arry,len);
    PrintArry(arry,len);

    system("pause");
}                

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM