-
不基于比较的排序
-
前面提到的所有的排序都是基于比较的排序
-
不基于比较的排序举例:所有人的年龄排序(计数排序)
- 申请一个长度200的数组(词频表)
- 遍历所有年龄,遇到一个年龄就将对应下标的计数加一;O(N)
- 遍历长度200的数组,就可以输出排序结果;O(N)
-
不基于比较的排序一定要根据数据状况来定制
-
-
基数排序(不基于比较的排序)
-
在数字前面补零,将所有数字补成一样长
-
准备0-9号桶(假设桶用队列实现)
-
根据个位将数字放到桶里
- 遍历0-9号桶,取回所有数到数组(先进先出)
-
再根据十位将数字放到桶里
- 遍历0-9号桶,取回所有数到数组(先进先出)
-
……
-
越重要的位要放在越后面,以后面的数字为准
-
比计数排序泛用性更好,只要认为是固定进制就好,不用准备很大的词频表
-
代码实现有较大的优化
-
对每一位要进桶前,先统计(该位)词频
-
将词频数组转换为前缀和数组
- 原来的含义是个位数等于2的有多少个
- 现在的含义是个位数小于等于2的有多少个
-
需要一个和排序数组同样大小的辅助数组
-
从右往左遍历原数组,(最右说明入桶时最后入桶,出桶时也最后出),再利用前缀和数组,放入辅助数组中,等于完成了一次入桶出桶
-
-