計數排序利用的是陣列的隨機訪問特性,將要排序的數k轉換成陣列的下標k,該陣列中以k為下標的值a[k]代表這個數k的個數。這種排序非常快,但應用條件比較苛刻。
主要受需要排序的序列規模(n),序列最大值(max(n))影響,如果max(n)過大,演算法空間複雜度比較高,也是該演算法的乙個制約因素。下面是兩種方式實現:
1) 第一種方式速度比第2種快,但沒有穩定性,而且不能用於基數計數排序。
private void countsort(int a)
thec[a[i]-1]++;
thecount++;
}int j = 0;
for (int i = 0; i < themaxval; i++)}}
2)教科書裡的演算法,優點是具有穩定性,可用於基數計數排序。速度比前一種要慢些。時間約為2(n+k)
private int countsort2(int a)
thec[a[i]-1]++;
thecount++;
}for (int i = 1; i < themaxval; i++)
for (int i = thelen-1; i>=0; i--)
return theb;
}private void addlength(listc, int maxlen)
}後記:計數演算法適合序列元素比較集中,差值不大的情況。如果知道乙個序列的最大值和最小值,而且最大值與最小值相差不是很大的情況,比較適合用這種排序。
字母排序,簡單數字符號(0-9)排序等。
非比較排序 計數排序
計數排序 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 的時候其效率反而不如基...