0%

基数排序

简介

思想

将阵列分到有限数量的桶子里,每个桶子再进行排序

子桶内排序方法不限,有可能仍是桶排序或其他排序方法

思路

  1. 大小为[1…1000]范围内的n个整数A[1…n]待排排序;

  2. 把桶设为大小为10的范围,具体而言,设集合B[1]存储[1…10]的整数,集合B[2]存储 (10…20]的整数,……集合B[i]存储( (i-1)10, i10]的整数,i = 1,2,…100。总共有 100个桶;

  3. 对A[1…n]从头到尾扫描一遍,把每个A[i]放入对应的桶B[j]中;

  4. 再对这100个桶中每个桶里的数字排序(方法不限);

  5. 依次输出桶中的值,会得到有序序列;

缺点

  1. 空间复杂度高,需要2个待排序列的空间;

  2. 待排的元素都要在一定的范围内;

基数排序

思想

是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前

思路

稳定性

基数排序基于分别排序,分别收集,所以是稳定的

关键码排序

设n 个元素的待排序列包含d 个关键码{k1,k2,…,kd},则称序列对关键码{k1,k2,…,kd}有序是指:对于序列中任两个记录r[i]和rj都满足下列有序关系:

关键码排序方法1

最高位优先(MSD)法

  1. 先按k1 排序分组,将序列分成若干子序列,同一组序列的记录中,关键码k1 相等;

  2. 再对各组按k2 排序分成子组,之后,对后面的关键码继续这样的排序分组,直到按最次位关键码kd 对各子组排序后;

  3. 再将各组连接起来,便得到一个有序序列。扑克牌按花色、面值排序中介绍的方法一即是MSD 法;

关键码排序方法2

最低位优先(LSD)法

  1. 先从kd 开始排序,再对kd-1进行排序,依次重复,直到按k1排序分组分成最小的子序列后;

  2. 最后将各个子序列连接起来,便可得到一个有序的序列, 扑克牌按花色、面值排序中介绍的方法二即是LSD 法;

案例分析

待排序列:52张扑克牌;
优先级:

花色:黑心 > 红心 > 方块 > 梅花;
面值:2 …… A

排序方法1

先对花色排序,将其分为4 个组,即梅花组、方块组、红心组、黑心组。再对每个组分别按面值进行排序,最后,将4 个组连接起来即可

排序方法2

  1. 先按13 个面值给出13 个编号组(2 号,3 号,…,A 号);
  2. 将牌按面值依次放入对应的编号组,分成13 堆;
  3. 按花色给出4 个编号组(梅花、方块、红心、黑心),将13组中的牌取出放入对应花色组;
  4. 将4个花色组l连接起来就是目标有序列表;