【編程題目】如何對n個數進行排序,要求時間復雜度O(n),空間復雜度O(1)


轉自:http://blog.csdn.net/vast_sea/article/details/8167968

看上去似乎任何已知的算法都無法做到,如果誰做到了,那么所有的排序方法:QuickSort,ShellSort,HeapSort,BubbleSort等等等等,都可以扔掉了,還要這些算法干嗎阿,呵呵。不過實際上,在數字范圍有限制的情況下,是有一個這樣的算法的,只需要用一個數組記錄每個數字出現次數就可以了。

假定你的數字范圍在0到65535范圍之內,定義一個數組count[65536](這個空間是常量,和n無關,所以是O(1) ),初值全部為0。
那么假設有下面這些數字:
100
200
300
119
0
6
...
那么對於每個這個數字,都做在count中記錄一下:
100 => count[100]++
200 => count[200]++
300 => count[300]++
119 => count[119]++
0 => count[0]++
6 => count[6]++
...
最后,遍歷一邊所有這些數字就可得到0~65535每個數字的個數(在count數組中),然后再順序遍歷count數組,count[n] = m,則輸出m個n,(比如說有count[3] = 2, 那么說明有2個數字3),依次輸出,最后可得結果。第一次遍歷是O(n),第二次遍歷是O(1),為常量,所以最后的時間復雜度為O(n),而空間復雜度為O(1)
這個算法很簡單,相信大家都會,只是這個題太過於變態了,一般會把面試者嚇住


免責聲明!

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



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