排序 計數排序

2021-06-15 07:27:14 字數 2203 閱讀 1133

資料結構和演算法系列目錄(不斷更新):

計數排序是一種線性時間的排序,它的時間複雜程度為o(n),雖然是線性的時間複雜程度,但是它的空間複雜程度比較高,而且用之前需要有乙個硬性的前提。這個前提在後面給出,這裡先來簡單介紹一下計數排序。計數排序是先掃瞄一邊待排序陣列,並用乙個輔助陣列記錄待排序每個元素應該在排序好陣列中的位置資訊。

現在說一下用計數排序的前提。計數排序需要用輔助陣列記錄排序位置資訊,當然就需要知道這個輔助陣列的大小。輔助陣列的大小取決於待排序陣列中元素的取值範圍。例如,待排序陣列中的元素範圍介於0到k,那麼就需要用大小為k+1的陣列來當作輔助陣列。所以,計數排序需要事先知道待排序陣列元素的取值範圍,但是當這個取值範圍區間非常大時,將會需要很多的額外空間,所以這個情況不建議使用計數排序。那麼什麼時候適合用呢?我這裡給出乙個可能不太恰當的場景,就是學生分數的排名。比如百分制的時候,只需要101個元素的輔助陣列,但是待排序的學生成績可能有上千甚至更多,這時使用計數排序還是很好的。計數排序的使用範圍是一段元素的離散值密集在乙個不太大區間範圍內。這裡待排序元素不一定都是要從0開始,比如從50~100的區間也是可以適用的,就是在演算法實現時對映的演算法稍加改變即可,在這個例子中可以把原來從0開始的對映進行加50的操作。當然,步長也不一定是1,對應改變對映關係即可。

找出待排序陣列中的最大值和最小值,即待排序陣列的區間範圍

統計出陣列中每個值為i的元素出現的次數,存入的輔助陣列中對應的對映位置(對映關係根據情況確定)

對輔助陣列進行累加,即從輔助陣列中第二個元素開始,更新每個元素的值為該項和前一項的和

反向填充(從待排序陣列最後乙個元素開始),將每個元素i放在儲存排序結果陣列中對應對映關係的map(i)項中,並將輔助陣列中該元素的值進行減1操作

首先說明一點,計數排序並不是一種比較排序(如氣泡排序,比較排序等),它的實際執行效率為o(2n+k),其中n是待排序陣列的元素個數,k是待排序區間範圍包含的不重複元素個數。計數排序的最優,最差以及平均時間複雜程度都是o(2n+k)。從時間複雜程度可以看出,計數排序比比較排序都要快。缺點就是它需要的輔助空間可能會很多,所以是否需要計數排序要根據實際情況來判斷。另外,在實現計數排序最後一步是用反向填充,這一點可以保證計數排序是一種穩定排序演算法。

比較懶了,這個要畫圖,以後再附上。大家可以參考演算法導論上的例子。 

#include #include int 

main(int argc, char const *argv)

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

scanf("%d", &numbers[i]);

counting_sort(numbers, length, max_number + 1);

printf("%d", numbers[0]);

for(i = 1; i < length; i++)

printf(" <= %d", numbers[i]);

printf("\n");

free(numbers);

} return 0;

}int

counting_sort(int *numbers, int length, int max_number)

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

count[numbers[i]] += 1;

for(i = 1; i < max_number; i++)

count[i] += count[i - 1];

for(i = length - 1; i >= 0; i--)

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

numbers[i] = target[i];

free(count);

free(target);

return 1;

}

程式較為簡單,只給出了一種最簡單的對映關係,複雜點的對映關係讀者可自行嘗試。

計數排序只是眾多排序演算法中的一種。其他排序演算法會在後面的一些部落格中進行總結。另外,計數排序的對映關係可以看作是一種hash對映的特殊形式,與桶排序有很多相似的地方,後面介紹桶排序的時候再進行比較。

1. introduction to algorithms(second edition), thomas h.cormen & charles e.leiserson

2. counting sort, 

說明:

資料結構和演算法部落格系列的目錄為:

最後更新時間2013-07-04

排序 計數排序

計數排序假設n個輸入元素中的每乙個都是在0到k區間內的乙個整數,其中k為某個整數。當k o n 時,排序的執行時間為 n 計數排序的基本思想是 對每乙個輸入元素x,確定小於x的元素個數。利用這一資訊,就可以直接把x放到它在輸出陣列中的位置上了。例如,如果有17個元素小於x,則x就應該在第18個輸出位...

python計數排序 Python 計數排序

1.python coding utf 8 def counting sort a,b,k 計數排序,偽碼如下 counting sort a,b,k 1 for i 0 to k 初始化儲存區的值 2 do c i 0 3 for j 1 to length a 為各值計數 4 do c a j ...

排序11 計數排序

這裡再介紹一種排序演算法,該方法也是不需要進行元素間的比較,卻能實現排序過程的。不過,與基數排序一樣,它所處理的序列也有些限制 序列元素必須為非負整數,且大小有上限。仍以序列 49 38 65 97 76 13 27 49為例。計數排序的思想在於 首先,求取該序列中最大的元素,顯然為97。然後,建立...