計數排序(線性時間排序) 演算法導論

2021-08-27 16:37:50 字數 1953 閱讀 6509

之前的排序都是通過比較得到的,即比較排序在排序的最終結果中,各元素的次序依賴與它們之間的比較。而時間複雜度最好的也是o(nlgn),接下來說乙個未經比較的排序,而複雜度則是線性的。

計數排序:假設n個輸入元素的每乙個都是在0-k區間內的乙個整數,其中k為某個整數。當k = o(n)時,排序的執行時間為o(n)。

計數排序的基本思想是:對每乙個輸入元素x,確定小於x的元素個數。利用這一資訊,就可以直接把x放到它在輸出陣列中的位置上了。例如,如果有17個元素小於x,則將x放在第18個位置即可。但是當存在幾個元素相同時,會稍許不同,否則中間會漏掉元素。

在計數排序演算法中,假設輸入是乙個陣列a[1..n],a.length = n。另外陣列b[1...n]存放排序的輸出,c[0...k]提供臨時的儲存空間:

第1-2行,c陣列賦值為0;

第3-4行,記錄各個元素的個數,下圖中a圖;

第6-7行,對陣列c操作,c[i] = c[i]+ c[i- 1];見下圖中b圖

第9-11行,排序...下圖中c,d,e圖是執行9-11**一次、二次、三次的結果,f是結果;

int k = 10001; //保證排序資料在0-k中

//k = max(a, length) + 1; //k = max + 1;後面方便操作

countsort(a, b, k, length); //計數排序

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

cout令k = 10001,保證排序資料在0 - 10000中,若是想更合理的進行計數排序,令k = max(a, length) + 1;找到陣列中最大元素即可,複雜度同樣是o(n),不過這樣感覺有點不符合計數排序的規則(無需比較大小o(∩_∩)o)。

其中:

c[a[j]] = c[a[j]] - 1; //若是出現同樣的數往前放

這一句是對出現重複資料進行操作的,大家可以根據陣列中是否出現重複數字選擇注釋或不注釋該語句從而得到結論,感興趣的試試;

o(∩_∩)o

演算法導論 第8章 線性時間排序 計數排序

計數排序 n個元素都是0到k範圍得整數,當k o n 時,排序執行時間為o n 思想 對於數x,確定小於x的個數m,將x放在第m 1個位置上 例子 假設3個元素小於x,那麼x應該放在4上 輸入第一行的第乙個數n是陣列的個數,第一行第二個數表示所有n的元素中最大的數k 接下來的第二行就是n個數字 輸入...

《演算法導論》第8章 線性時間排序 1 計數排序

一種簡單的實現是得到陣列c,c i 表示陣列a中值為i的元素個數。c 就表示兩個0,兩個2,三個3,乙個5。然後將這些數字依次存到陣列b中。include include void printarray int,int void counting sort int a,int b,int len,i...

演算法導論 計數排序

不管所堆排序,還是快速排序,排序的本質都所基於各個元素之間的比較。而可以證明的是,所有基於比較的排序演算法,在最壞情況下的時間複雜度的下界是o nlgn 而,計數排序不所基於元素之間的比較,而是,對於乙個輸入x,在整個輸入中確定出小於x的元素個數,這樣就可以把元素x直接放在它在最終輸出陣列中的確定位...