待補充
題目:乙個陣列中只有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#includeusing
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的個數了。然後第...