內部非比較排序 計數排序

2021-07-01 21:11:22 字數 2103 閱讀 5104

計數排序是一種演算法複雜度

o(n)

的排序方法,適合於小範圍集合的排序。比如

100萬學生參加高考,我們想對這100萬學生的數學成績(假設分數為0到100)做個排序。我們如何設計乙個最高效的排序演算法。本文不光給出計數排序演算法的傳統寫法,還將一步步深入討論演算法的優化,直到時間複雜度和空間複雜度最優。

計數排序是乙個類似於桶排序的排序演算法,其優勢是對已知數量範圍的陣列進行排序。它建立乙個長度為這個資料範圍的陣列c,

c中每個元素記錄要排序陣列中對應記錄的出現個數。這個演算法於2023年由 harold h. seward 提出。

下面以示例來說明這個演算法

假設要排序的陣列為 a =

這裡最大值為3,最小值為0,那麼我們建立乙個陣列c,長度為4.

然後一趟掃瞄陣列a,得到a中各個元素的總數,並保持到陣列c的對應單元中。

比如0 的出現次數為2次,則 c[0] = 2;1 的出現次數為4次,則c[1] = 4

由於c 是以a的元素為下標的,所以這樣一做,a中的元素在c中自然就成為有序的了,這裡我們可以知道 順序為 0,1,3 (2 的計數為0)

然後我們把這個在c中的記錄按每個元素的計數展開到輸出陣列b中,排序就完成了。

也就是 b[0] 到 b[1] 為0  b[2] 到 b[5] 為1 這樣依此類推。

這種排序演算法,依靠乙個輔助陣列來實現,不基於比較,演算法複雜度為 o(n) ,但由於要乙個輔助陣列c,所以空間複雜度要大一些,由於計算機的記憶體有限,這種演算法不適合範圍很大的數的排序。

注:基於比較的排序演算法的最佳平均時間複雜度為 o(nlogn)

上面這段引自麻省理工大學計算機演算法教材的技術排序部分,我不做翻譯了。這個就是這個演算法的典型解法,我把它作為方案1.

這個演算法的實際掃瞄次數為 n+k (不包括寫的次數)

方案1

public

static

void sort(int a, out

int b, int k)

for (int i = 1; i <= k; i++)

for (int j = a.length - 1; j >= 0; j--)

}上面**是方案1 的解法,也是計數排序演算法的經典解法,麻省的教材上也是這樣解。不過這個解法並不是最優的,因為空間複雜度還應該可以優化,我們完全可以不要那個輸出的陣列b,直接對a進行排序。在繼續看方案

2之前,我建議大家先自己思考一下,看看是否有辦法省略掉陣列b

方案2

我們對上述**進行優化

public

static

void sort(int a, int k)

int z = 0;

for (int i = 0; i <= k; i++)

} }

由於c陣列下標 i 就是a 的值,所以我們不需要保留a中原來的數了,這個**減少了乙個陣列b,而且要比原來的**簡化了很多。

和快速排序的速度比較

拿本文剛開始那個高考成績的例子來做

int a = new

int[1000000];

int b = new

int[1000000];

random rand = new random();

for (int i = 0; i < a.length; i++)

a.copyto(b, 0);

stopwatch sw = new stopwatch();

sw.start();

array.sort(b);

sw.stop();

console.writeline(sw.elapsedmilliseconds);

sw.reset();

sw.start();

countingsort.sort(a, 100);

sw.stop();

console.writeline(sw.elapsedmilliseconds);

輸出結果

134 //快速排序

18   //計數排序

可見計數排序要比快速排序快將近6倍左右。

非比較排序 計數排序

計數排序 count sort 是乙個非基於比較的排序演算法,該演算法於1954年由 harold h.seward 提出。它的優勢在於在對一定範圍內的整數排序時,它的複雜度為 n k 其中k是整數的範圍 快於任何比較排序演算法。計數排序的思想類似於雜湊表中的直接定址法,在給定的一組序列中,先找出該...

計數排序 非比較排序

1.統計相同元素出現的個數 2.根據統計結果將序列 到原來的序列中 整體思路如下圖 判斷最大最小值的差值 int a newint count 開空間 memset a,0 sizeof int count 記得將原空間清空 for int i 0 i n i int j 0 int q 0 whi...

非比較排序 計數排序

計數排序是乙個非基於比較的排序演算法,該演算法於1954年由 harold h.seward 提出。它的優勢在於在對一定範圍內的整數排序時,它的複雜度為 n k 其中k是整數的範圍 快於任何比較排序演算法。1 當然這是一種犧牲空間換取時間的做法,而且當o k o nlog n 的時候其效率反而不如基...