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 可以更快地跳过相同的前缀。