排序11 計數排序

2021-06-26 01:51:56 字數 1152 閱讀 5257

這裡再介紹一種排序演算法,該方法也是不需要進行元素間的比較,卻能實現排序過程的。不過,與基數排序一樣,它所處理的序列也有些限制:序列元素必須為非負整數,且大小有上限。

仍以序列:

49、38、65、97、76、13、27、

49為例。計數排序的思想在於:首先,求取該序列中最大的元素,顯然為97。然後,建立乙個下標為0~97的整型陣列counts,且該陣列的每個元素均初始化為0。接著,處理待排序序列的第1個元素,該元素是49,則令counts中下標為49的元素加1,也即,counts[49]現在由0變為1。以同樣的方式順次處理待排序序列中的所有剩下的元素。注意,最後處理到49時,同樣令counts[49]的值加1,則此時的counts[49]的值變為2。顯然,最終的counts陣列存放了0~97這些數字在待排序序列中的出現次數(沒出現過的則為0),且counts的下標恰好能實現按序排列的目的。接下來要做的就是:從下標0開始直到97,遍歷counts陣列,每遍歷到某個下標i時,假如counts[i]為t,則輸出t個i。到了最後,剛才所有的輸出順次相連,明顯將形成排序後的結果。

實際上,這種排序演算法不適合討論是否穩定。不過,你可以把它視為穩定排序。**如下:

int getmax(int list,int length)

return list[max];

}void countsort(int list,int length)

{ int max=getmax(list,length);

int * counts=new int [max+1];

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

counts[i]=0;

for(int i=0;i

設序列元素個數為n,該序列中所有的元素均為0~max的整數。顯然,無論初始序列為何種情形,都得遍歷全部元素,並分別在counts相應的下標值上加1,此操作的總次數為n。然後又遍歷counts以執行輸出動作,該步的總操作次數為max+1+n。再算上初始時,求取待排序序列中最大值所需要的操作次數n,以及初始化counts所花費的操作次數max+1。整個排序過程總操作次數為:n+max+1+n+max+1+n=3n+2max+2。綜上,時間複雜度為o(n+max)。從時間複雜度可看出,該排序是時間效能最好的排序,不過卻大大犧牲了儲存空間上的效能!由於要用到長度為max+1的陣列counts作為輔助儲存空間,該演算法的空間複雜度為o(max)。

2 7 演算法 11 計數排序

演算法子目錄 計數排序的基本思想在於給定的輸入序列中的每乙個元素x,確定該序列中值小於等於x元素的個數,然後將x直接存放到最終的排序序列的正確位置上。有點類似mapreduce的map過程。import random from a.cat time import cal time cal time ...

排序 計數排序

資料結構和演算法系列目錄 不斷更新 計數排序是一種線性時間的排序,它的時間複雜程度為o n 雖然是線性的時間複雜程度,但是它的空間複雜程度比較高,而且用之前需要有乙個硬性的前提。這個前提在後面給出,這裡先來簡單介紹一下計數排序。計數排序是先掃瞄一邊待排序陣列,並用乙個輔助陣列記錄待排序每個元素應該在...

排序 計數排序

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