基数类
基数排序¶
【基数排序】基数排序属于“分配式排序”,又称“桶子法”
【思想】“多关键字排序”:它是通过键值的部份资讯,将要排序的元素分配至某些“桶”中
【两种实现方法】
方法 | 介绍 | 例子:扑克牌 |
---|---|---|
最高位优先 | 1. 先按一种规则( 最高位 )将数据分成若干个子序列 2. 再对每个子序列按 次高位 排序 |
1. 先准备4个桶,按 花色 (最高位)进行分配; 2. 再对每种花色13张牌进行排序(可以采用其他排序方法,也可采用最低位基数排序) |
最低位优先 | 不必分成子序列 ,每次排序 全体元素都参与 。可以不通过比较,而通过“分配”和“收集”来进行排序 | 1. 准备13个桶,按**数字**将牌分配到13个桶中; 2. 然后从第一个桶开始依次收集; 3. 再将收集好的牌按**花色**分配到4个桶中 4. 然后还是从第一个桶开始依次收集 经过两次“分配”和“收集”操作,最终使牌有序 |
【 最低位优先基数排序 用于数字排序的步骤】从 最低位 开始基数排序
- 准备10个桶(先进先出的队列,从桶的上面进,下面出)
- 按关键字的 个位 ,分流到10个桶中,然后再按顺序收集元素
- 按关键字的 十位 ,分流到桶中,然后再按顺序收集元素
- 一直下去,直到数字最大值的最高位
【特殊符号】
- n:为序列中元素的个数
- d:为元素的关键字位数(如930,有三位数,d=3)
- rd:关键字每一位的取值范围(如关键字为930,每一位的取值都0-9,所以rd=10)
【时间复杂度】平均和最坏情况下都是O(d(n+rd))
- 基数排序的每一趟都要进行“分配”,“收集” → n+rd
- 分配:依次对序列中每个关键字进行,即要扫描整个序列 → n
- 收集:需要依次对每个桶进行收集,而桶的数量取决于关键字的取值范围 → rd
- 基数排序需要d趟(关键字的位数) → d
【空间复杂度】O(rd):每个桶实际上是一个队列,需要头尾指针,共有rd个桶,所以需要2rd个存放指针的空间
【评价】基数排序适合的 元素很多 的情况,但组成元素的关键字的 取值范围较小 ,如数字0-9是可以接受的
- 如果关键字取值范围很大,比如26个字母,并且序列中大多数元素的 最高位关键字都不相同,那么这时可以考虑使用 “最高位优先法”。先根据最高位排成若干子序列,然后分别对这些子序列进行直接插入排序