20230407 10.3. 基数排序

桶排序

假设我们有 N 个学生,他们的成绩是0到100之间的整数(于是有 M = 101 个不同的成绩值)。如何在线性时间内将学生按成绩排序?

void Bucket_Sort(ElementType A[], int N) 
{ 
    count[]初始化;
    while (读入1个学生成绩grade)
        将该生插入count[grade]链表;
    for ( i=0; i<M; i++ ) {
        if ( count[i] )
            输出整个count[i]链表;
    }
}
  • T(N, M) = O( M+N )

基数排序

假设我们有 N = 10 个整数,每个整数的值在0到999之间(于是有 M = 1000 个不同的值)。还有可能在线性时间内排序吗?

输入序列: 64, 8, 216, 512, 27, 729, 0, 1, 343, 125

“次位优先”(Least Significant Digit)

基数排序

多关键字的排序

一副扑克牌是按2种关键字排序的:

  • K0 [花色]
  • K1 [面值]

两种排序方式:

  • “主位优先” ( Most Significant Digit ) 排序:为花色建4个桶,在每个桶内分别排序,最后合并结果。
  • (更优)用 “次位优先” ( Least Significant Digit ) 排序:为面值建13个桶,将结果合并,然后再为花色建4个桶

LSD(Least Significant Digit)和 MSD(Most Significant Digit)都是基数排序算法的变体,它们的主要区别在于排序的方向。LSD 从最低位开始排序,而 MSD 从最高位开始排序。

在一般情况下,LSD 和 MSD 的性能差异取决于输入数据的特征。对于随机分布的数据,LSD 和 MSD 的性能差异不大。但是,对于某些特定的数据分布,LSD 和 MSD 的性能可能会有很大的差异。例如,如果输入数据中存在大量的前缀相同的字符串,那么 MSD 排序算法的性能可能会比 LSD 更好,因为 MSD 可以更快地跳过相同的前缀。

posted @ 2023-06-21 16:23  流星<。)#)))≦  阅读(0)  评论(0编辑  收藏  举报