線性時間排序概述

2021-10-10 13:34:40 字數 1357 閱讀 4756

如果我們待排序的資料在乙個區間內,可以使用分治的思想來排序。

例如:如果給你要給乙個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...