数据结构(八)——内部排序之桶排序和基数排序
桶排序的概述
重要的参数
- a【】:作为桶的数组
- count【】:记录前若干个桶的累计
基本思想
-
首先进行一次扫描,知道了所要排的数据的最小值和最大值(即位于哪个区间)
-
通过知道的区间设立桶的个数,每个桶对应一个值
-
首先扫描一边,利用count【】记录桶中每个数据出现的次数(第一次对count【】操作)
-
将count【】数组的元素从头开始向后累加(第二次对count【】操作)
(图片来源于 mooc - 数据结构与算法 - 北京大学 - 张铭) -
这个时候,count【】里面存的就是每个桶对应的数扫描到后应该在的最后位置,且每扫描到一个数,该数存储到相应的位置后,对应桶的count【】- 1 (这个操作是因为每一个桶对应的元素可能不止一个,排序后的数的count【】 - 1 后就是确立了重复的数应该排的位置)
-
执行到待数组全排序后即可
算法分析 -
时间复杂度:O(n + m),n为数组的个数,m为桶的个数,适用于m相对于n很小的情况
-
辅助空间:O(m)
基数排序的概述
关键参数
- Q【0~9】:一个长度为十的队列,队列中0-9都为链表的头
基本思想
- 首先,对待排关键字的个位数进行排序,为0的排到Q【0】,为 1 的排到Q【1】,以此类推,排序完后,将排序好后的数据从Q【0】开始到Q【9】读回原本的存储待排序列的数组里
- 然后,对第一次排好的关键字的十位进行比较,规则如上。
- 一直重复以上步骤,每重复一次,位数往高位挪一位,直到全部数的最高位挪完。
- 则那时导回存储的数组里的序列为排好序的序列
算法分析
- 时间复杂度:O(dn),d为关键字的位数
- 空间复杂度:O(n + B)