1. 程式人生 > >九章演算法面試題32 小球排序

九章演算法面試題32 小球排序

九章演算法官網-原文網址


題目

有紅黃藍三色的小球若干排成一列,這些小球進行排序,請使用盡量少的空間和時間。

解答

假設順序為紅色黃色藍色。用兩根指標從頭開始遍歷,第一根指標遇到非紅色時停下,如果第二根指標找到第一根指標之後的第一個紅色停下,交換兩根指標所指顏色。重複上述過程。直到第二根指標找不到任何紅色。此時第一根指標到最後都是黃色或藍色。以黃色為標準繼續往後做相同的操作,則可以把黃色和藍色排好序。在遍歷的過程中,由於第二根指標不需要每次都回到第一根指標所在位置往後遍歷,所以複雜度是O(n)的。


面試官角度

這個題目是對排序演算法的考察。很顯然,一般來說求職者至少都能夠答上O(nlogn)的排序方法。進一步也可能會想到使用計數排序的O(n)的方法(因為只有三個顏色,統計每個顏色的個數即可)。此時面試官會要求說,如果不適用計數排序,通過簡單的比較和交換能否獲得O(n)的效率呢?很多求職者此時就會蒙掉,因為他們覺得計數排序已經最好了,面試官一定是在為難自己。在面試的過程中如果出現這種心態(覺得面試官為難自己)是非常可怕的,面試官從來不會為難求職者。面試官只是希望通過設定不同的限制條件,考察求職者的思維活躍程度。因為在實際工程中,很多情況下,都無法完全在理想的外界環境下考慮問題,需要同時考慮很多限制條件,此時正是你展現才能的時候,抓住面試官“為難”你的機會,才能脫引而出,拿到Offer。