排序之四(線性時間排序)

2021-06-18 20:41:46 字數 2525 閱讀 6739

1.     排序模型

排序時間下界引出的排序模型

o   基於比較的排序(決策樹模型):n個元素的決策樹葉節點需要n!個葉子。從而樹高度由斯特勞林公式可以求得近似為o(nlgn)。因此最優的下限為o(nlgn)。普通排序都是基於比較的,如插入,歸併,快排,堆排。其中歸併和堆排是漸進最優的。基於比較的排序都可以轉換為決策樹模型。

o   計數模型:基於計數的排序

o   基數模型:基於不同關鍵字的排序

計數排序

應用條件:鍵值在乙個合理的範圍1--k,k不是太大。

計數排序思想:要排序a[n].對於每個鍵值的元素x,先確定比x小的元素的個數,則x的位置即可確定。比如,如果有10個元素比x小,則x一定為第11個元素。

使用k個元素的輔助空間c[k]來儲存元素值小於等於(小於等於,因此可以從後往前排出相同元素的鍵的最後乙個的位置)k的元素的個數資訊。

使用另乙個長度為n的空間b[n]來儲存最後的結果。

演算法先初始化並計算出c[k]的值。

從a的最後乙個元素開始,由c[a[j]]確定第j個位置應該排的位置,從而將該元素填入b中,即b[c[a[j]]]=a[j],並遞減c[a[j]]=c[a[j]] -1,因為a[j]的元素已經少乙個了。位置需要往前移動乙個。

複雜度分析:

空間複雜度:o(n+k)。輔助的計數空間和儲存空間。

時間複雜度:o(n+k)。計算c[k]需要o(k),排序填b[n]需要o(n)。同時依賴於k和n。當k為o(n)時,時間複雜度即為o(n)。如果k為n^2或2^n等非線性的,則複雜度和o(nlgn)相比可能就更耗時了。

穩定性:是穩定的排序。從a的最後乙個元素掃瞄時是穩定的,如果從前往後掃瞄則不穩定。

原地性:不是原地排序。

應用

元素取值相對不太大。即每個key都比較小。或者k為o(n)的。

l  如果處理的數字都比較小,如都為乙個位元組的[0,256],則c只需要256個長度即可,時間複雜度為o(256+n)。這時候n較大也只為線性的。

l  如果key可能為任何整數,則k為2^32則所需的c比較大,為2^32,大約為16g。

基數排序

基數排序的典故。打孔機,人口普查問題。

基數排序思想:多關鍵字排序。如果關鍵字為簡單的整數,則可以按個位,十位,等等分作不同的關鍵字位。從關鍵字較低的位置開始到高關鍵字每個關鍵字進行穩定排序。注意每個關鍵字的排序必須穩定,否則不正確。直到最高為關鍵字排序完。則排序結束。對於整數,關鍵字的劃分也可以按位元組進行劃分。高位元組低位元組劃分為不同的關鍵字。

實際處理時,結合計數排序,將要排序的數按固定位數的bit位進行劃分關鍵字。對每個關鍵字內部用計數排序進行排序。

如:n個數,每個數最多為b個bit位。則數的取值範圍為1--2^b-1。按b/r來劃分關鍵字,即將n個b個bit位的數,每個按r個bit進行劃分。

複雜度分析:(以上述劃分方法)

空間複雜度:o(n+2^r)計數排序的空間複雜度。

時間複雜度:共劃分出b/r個關鍵字,每個關鍵字的一趟排序為o(n+k)即o(n+2^r);從而總的時間為o(b/r * (n+2^r) ).

b,n是由陣列給定的,r是可選的。因此選擇r使得上式達到最小值即可。標準為對上式求導來求極值。特別也可以b*n/r和b*2^r/r相當,即r=lgn的時候。帶入上式,得時間為o(bn/lgn)。b為key的bit數,因此key的範圍為0到2^b-1;如果key範圍和n的關係上,如果key在0到n^d-1即最多為元素個數的d次方。則時間為o(d*n)。如果d為o(1)的,則時間為o(n)的。

穩定性:穩定的排序。

原地性:不是原地的

應用:與計數比,不再要求key的範圍不是太大的要求。比如如果對取值可能為int的數,則按8bit取值進行劃分。則只需要256個輔助空間。進行4論計數排序。相反如果是o(nlgn)的比較排序則,如果比較的個數n為2000,需要lgn**約11次比較。但是計數和基數比較空間複雜度要求較高,因此一般情況下還是快排等方法比較好,除非key比較小。

桶排序

應用條件:輸入符合均勻分布,值在0到1之間;則可以在o(n)時間內排序。和計數要求key不太大一樣,桶排序要求輸入均勻分布在0到1之間。

排序思想:由限制條件。將[0,1)均勻劃分為n個區間,或稱作桶。再將n個輸入分布到桶中。由於均勻的假設,則每個桶中一般不會有太多個元素。為了排序,只需先對每個桶進行排序,再順序輸出每個桶即可。

複雜度

時間複雜度:期望複雜度為o(n).

應用:如果輸入不均勻時,只要各桶尺寸的平方和桶中元素的個數呈線性,則也可以。

演算法下界 對於

key取值在

1個機器指令操作內的情況,目前最優

nlglgn,n

(lglgn

)^1/2。

線性時間排序之基數排序

標頭檔案 number.h pragma once include include include using namespace std class number include number.h number number int num number number void number nu...

線性時間排序

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 ...