之前介绍的排序算法:
- 【算法】插入排序——希尔排序+直接插入排序_Rinne’s blog-CSDN博客
- 【算法】选择排序——堆排序+直接选择排序_Rinne’s blog-CSDN博客
- 【算法】交换排序——快速排序+冒泡排序(更新了非递归冒泡以及优化)_Rinne’s blog-CSDN博客
- 【算法】归并排序_Rinne’s blog-CSDN博客
计数排序
计数排序是一个非基于比较的排序算法,该算法于1954年由
Harold H. Seward
提出它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法
当然这是一种牺牲空间换取时间的做法,而且当
O(k)>O(n*log(n))
的时候其效率反而不如基于比较的排序(基于比较的排序的时间复杂度在理论上的下限是O(n*log(n))
, 如归并排序,堆排序)
- 时间复杂度:
O(Max(N, Range))
- 空间复杂度:
O(range)
- 适合范围比较集中的整数数组
- 范围较大,或者是浮点数等等都
不适合
排序了
一、算法思路图解
1. 计数
基本思路:遍历数组a,a[i]
下标对应的count[a[i]]++
-
count数组大小
看样子范围应该是0到a数组中最大的数?
实则不是,如果数字是
1000, 1001, 1100
则从0到1100 ,浪费了很多空间
所以我们定义一个映射数组,所有的数字都是相对最小的数字的大小
1000, 1001, 1100
映射数组数字大小:a[i] - min
0, 1, 100
将它设置为count数组对应下标
2. 拷贝到原数组
这里主要是寻找数组下标与数组值之间的对应关系
-
count[i],拷贝的数字是i + min进入原数组ÿ