排序算法-计数排序
计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。当然这是一种牺牲空间换取时间的做法,而且当O(k)>O(n*log(n))的时候其效率反而不如基于比较的排序(基于比较的排序的时间复杂度在理论上的下限是O(n*log(n)), 如归并排序,堆排序)
1.排序过程
- 找出待排序的数组中最大和最小的元素;
- 创建一个桶(数组),大小是最大值-最小值+1。
- 遍历待排序数组,并往相应的桶里计数
- 遍历桶,找出计数大于0的下标,重新填入待排序数组
2.代码实现(Java)
1 | public static void countingSort(int[] arr) { |
3.算法分析
计数排序是一个稳定的排序算法。当输入的元素是 n 个 0到 k 之间的整数时,时间复杂度是O(n+k),空间复杂度也是O(n+k),其排序速度快于任何比较排序算法。当k不是很大并且序列比较集中时,计数排序是一个很有效的排序算法。
但是他的缺点也很明显,就是无法对小数进行排序。同时如果数据较大的话在空间和时间上不优于其他排序算法。所以在实际项目中要斟酌考虑。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 小树苗!
评论