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

2022-05-06 19:30:13 字數 910 閱讀 9508

第一眼看到這樣的題目,會舉得非常簡單,只需要兩次遍歷陣列就可以完成了。第一次遍歷,掃瞄陣列中的元素,每次遇到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

#include#includeusing namespace std;

void printarry(int arry,int len)

else if(k

實現只有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的個數了。然後第...