如果我們待排序的資料在乙個區間內,可以使用分治的思想來排序。
例如:如果給你要給乙個10g的訂單按照時間排序,此時的問題是你的記憶體只有幾百mb,那麼你該怎麼辦?
可以使用分治的思想。
把10g檔案遍歷一下,得到最小值和最大值,檢視他們之間的相隔數。
例如:最小:2019/11/13 01:00:25。最大:2019/11/20 10:12:14
我們可以按照天來分割為7個桶,或者按照4小時分割42個桶。
假設我們選擇第二種,遍歷檔案,從2019/11/13開始。
第乙個桶放2019/11/13 00:00:00- 2019/11/13 04:00:00
依次遞增。
這樣就形成了42個檔案。
對於每個檔案,把該檔案匯入記憶體進行排序。
我們就得到了42個有序的檔案。
由於這42個有序的檔案之間也是有序的。
所以從第乙個檔案開始遍歷,把所有的檔案遍歷輸出到乙個檔案即可。
這個排序適合資料在一定範圍內的,比較集中的。
比如:我們的資料集中在[10, 15]
。
整個範圍內存在的資料容量有15 - 10 + 1 = 6
。總共有6
個容量。
所以我們可以開闢乙個陣列大小為6
的陣列。
把每個資料放入對應的桶內。
例如:存在資料[10,15,12,13,10,15,12]
那麼我們開闢的資料儲存的元素內容就為
[2,0,2,1,0,2]
表示:10的個數,11的個數,12的個數...
這樣遍歷整個陣列就可以得到對應的排序後的資料了。
如果一組資料跨度較大,顯然不適合使用計數排序,因為需要開闢的額外空間太多。
如果使用桶排序,顯然效果也不會很好。
這個時候,基數排序就用上了。
例如:待排序的資料為[1,10253,152,1674,24581369]
這樣,我們可以先按照最後一位排序,因為每一位都在0-9
的範圍內,所以每一位可以使用計數排序。
那麼就是這樣:
第一次:[0, 1, 1, 1, 0, 0, 0, 0, 0, 1]
對應的:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
按照這個順序,把資料拿出來,就變為如下資料:
[1,152,10253,1674,24581369]
然後再比較倒數第二位,一直比較,沒有的按照0來比較。
這樣就可以實現跨度大的線性時間排序了。
線性時間排序
public void radixsort int a a k key 我們前面提到的方法,基本上都是比較排序,本篇介紹三種非比較型別的排序,計數排序 基數排序 桶排序,比較排序的最壞的情況都是經過nlgn的,線性排序的時間複雜度基本上都是線性關係。1.計數排序 計數排序不是通過元素之間的比較,而是...
線性時間排序
在最壞情況下任何比較排序演算法都需要做 nlgn 次比較 計數排序 假設輸入的資料都屬於乙個小區間內的整數 counting sort a,b,k 1.let c 0.k be a new array 2.for i 0 to k 3.c i 0 4.for j 1 to a.length 5.c ...
線性時間排序
決策樹模型 用處 證明基於比較的排序的時間複雜度為 nlgn 簡單描述 二叉樹,有n 個葉節點,則此樹在最茂盛的時候有最小的高度h lg n nlgn 因此至少需要nlgn次比較 計數排序 描述 對n個位於區間 0,k 的元素進行排序,複雜度為o n k 的穩定排序 c 11 include inc...