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

2022-03-06 16:29:09 字數 1726 閱讀 1646

待補充

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

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

這道題目如果只能進行一次遍歷,我們肯定會想到使用多指標。這種題目之前碰到過很多。類似折半查詢需要設定兩個指標,不過這道題目卻需要三個指標,分別指向陣列中0,1,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)

view code

#include#include

using

namespace

std;

void printarry(int arry,int

len)

void swap(int arry,int i,int

j)void sort(int arry,int

len)

//k指向第乙個非1值

while(arry[k] == 1

)

//j指向第乙個非2值

while(arry[j] == 2

)

if(i <= j && arry[j] == 0 && arry[i] == 2

)

else

if(k <= j && arry[k] == 2 && arry[j] == 1

)

else

if(i <= k && arry[k] == 0 && arry[i] == 1

)

else

if(i < k && k

if(i>k)

} }void

main()

;

int len=sizeof(arry)/sizeof(int

); printarry(arry,len);

sort(arry,len);

printarry(arry,len);

system(

"pause");

}

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

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

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

待補充 題目 乙個陣列中只有0,1,2三種元素,要求對這樣的陣列進行排序。第一眼看到這樣的題目,會舉得非常簡單,只需要兩次遍歷陣列就可以完成了。第一次遍歷,掃瞄陣列中的元素,每次遇到0則count0 遇到1則count1 遇到2則count2 這樣一趟下來就能夠統計出陣列中0,1,2的個數了。然後第...

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

待補充 題目 乙個陣列中只有0,1,2三種元素,要求對這樣的陣列進行排序。第一眼看到這樣的題目,會舉得非常簡單,只需要兩次遍歷陣列就可以完成了。第一次遍歷,掃瞄陣列中的元素,每次遇到0則count0 遇到1則count1 遇到2則count2 這樣一趟下來就能夠統計出陣列中0,1,2的個數了。然後第...