計數排序(英語:counting sort)是一種穩定的線性時間排序演算法。計數排序使用乙個額外的陣列c,其中第i個元素是待排序陣列a中值等於i的元素的個數。然後根據陣列c來將a中的元素排到正確的位置。當輸入的元素是n個0到k之間的整數時,它的執行時間是o(n + k)。計數排序不是比較排序,排序的速度快於任何比較排序演算法。
由於用來計數的陣列c的長度取決於待排序陣列中資料的範圍(等於待排序陣列的最大值與最小值的差加上1),這使得計數排序對於資料範圍很大的陣列,需要大量時間和記憶體。例如:計數排序是用來排序0到100之間的數字的最好的演算法,但是它不適合按字母順序排序人名。但是,計數排序可以用在基數排序演算法中,能夠更有效的排序資料範圍很大的陣列。
通俗地理解,例如有10個年齡不同的人,統計出有8個人的年齡比a小,那a的年齡就排在第9位,用這個方法可以得到其他每個人的位置,也就排好了 序。當然,年齡有重複時需要特殊處理(保證穩定性),這就是為什麼最後要反向填充目標陣列,以及將每個數字的統計減去1的原因。
public static int countsort(int a)
if(i < min)
}//這裡k的大小是要排序的陣列中,元素大小的極值差+1
int k = max - min + 1;
int c = new int[k];
for(int i = 0; i < a.length; ++i)
for(int i = 1; i < c.length; ++i)
for(int i = a.length-1; i >= 0; --i)
return b;
}
計數排序和基數排序很類似,都是非比較型排序演算法。但是,它們的核心思想是不同的,基數排序主要是按照進製位對整數進行依次排序,而計數排序主要側重於對有限範圍內物件的統計。基數排序可以採用計數排序來實現。 常用排序演算法 計數排序
顧名思義計數排序就是統計每個數出現的次數,例如給0 20範圍內的數排序,首先建立乙個長度為21的空陣列,然後統計每個數出現的次數,再按照下標存入空陣列中,例如1出現10次那麼陣列中的第二個元素為10 統計完所有的數之後呢在新建乙個陣列,在遍歷之前存放次數的陣列,按照個數往新陣列中新增對應的數。以乙個...
常用排序演算法總結7一一堆排序
在了解堆排序之前,我們有必要清楚 什麼是堆呢?堆 英語 heap 是電腦科學中一類特殊的資料結構的統稱。堆通常是乙個可以被看做一棵樹的陣列物件。在佇列中,排程程式反覆提取佇列中第乙個作業並執行,因為實際情況中某些時間較短的任務將等待很長時間才能結束,或者某些不短小,但具有重要性的作業,同樣應當具有優...
9 計數排序
計數排序是乙個類似於桶排序的排序演算法,其優勢是對已知數量範圍的陣列進行排序。它建立乙個長度為這個資料範圍的陣列c,c中每個元素記錄要排序陣列中對應記錄的出現次數。非原址排序。1 思路 計數排序演算法的基本思想是對於給定的輸入序列中的每乙個元素x,確定該序列中值小於x的元素的個數。一旦有了這個資訊,...