排序N個比N^7小的數,要求的算法是O(n)

採用基數排序,用10個桶(vector),每一個桶用隊列表示(queue),分別代表0-9,然後依次從低位到高位開始將要排序的數倒入桶中,然後再順序取出來,直到排序完成。

若有5個數,12,4,5,130,28

第一次(個位):

0: 130

1

2: 12

3

4: 4

5: 5

6

7

8 :28

9

然後順序取出來,130, 12, 4, 5, 28


第二次(十位),沒有十位視作0

0: 4 5

1: 12

2: 28

3: 130

4

5

6

7

8

9

然後順序取出來,4 5 12 28 130


第三次(百位),沒有百位視作0

0: 4 5 12 28

1: 130

2

3

4

5

6

7

8

9

然後順序取出來,4 5 12 28 130


第四次(千位),都爲0,退出


擴展:若內存限制1M,數字無重複,怎麼處理

由於每一個數小於10^7,若用位圖,掃描一遍所有數,然後根據位圖輸出即可,位圖所用內存不超過1M,可以兩次位圖,先0-499999,再50000-1000000。

在內存有限制的情況下,如果採用位圖來解決實際問題,而若全部放入位圖,可能導致內存使用量比較大。這個時候,我們可以分塊來解決,最後再合併起來,得到最終的結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章