基数排序MSD和LSD实现和比较

本文详细介绍了基数排序的LSD和MSD实现方法,包括算法流程,以及它们在性能、稳定性和适用场景上的区别。通过Java示例展示了LSD对整数和字符串的排序,并分析了MSD的优势和潜在的不稳定性。

目录

一.前言

二.算法实现思路

三.算法实现

(1)LSD基数排序

(2)MSD排序

四.算法性能分析和比较


一.前言

基数排序的关键是“多关键词排序

基数排序(Radix Sort)是一种非比较的排序算法,它根据元素的各个位上的值将元素进行排序。它可以分为最低有效位优先(LSD)和最高有效位优先(MSD)两种实现方式。

二.算法实现思路

当使用基数排序时,可以选择使用LSD(最低有效位优先)或MSD(最高有效位优先)算法。下面是它们的算法流程的简要介绍:

LSD(最低有效位优先)算法流程:

  1. 确定待排序元素的最大位数,假设为d。
  2. 最低有效位(个位)开始,依次对元素进行稳定的计数排序(或桶排序),根据当前位的值将元素分配到对应的桶中。
  3. 按照计数排序的结果,重新排列元素顺序。
  4. 重复步骤2和3,直到处理完最高有效位(最高位)为止。
  5. 完成排序后,元素按照从低位到高位的顺序排列,得到有序序列。

MSD(最高有效位优先)算法流程:

  1. 确定待排序元素的最大位数,假设为d。
  2. 最高有效位(最高位)开始,依次对元素进行排序。
  3. 将元素根据当前位的值分割成多个子序列(桶),每个子序列中的元素具有相同的当前位值。可以使用计数排序、桶排序或递归调用基数排序来对每个子序列进行排序
  4. 递归对每个子序列重复步骤2和3,直到处理完最低有效位(最低位)为止。
  5. 合并所有子序列,得到有序序列。

三.算法实现

我们用java语言对两种排序进行实现

(1)LSD基数排序

从低位到高位排序,我们首先需要获得我们需要排序的位数digit
static int getNumDigits(int[] num) {//获得最大的数的位数
    int max = num[0];//最大的数
    int digits = 0;//位数
        for (int i = 0; i < num.length; i++) {
            if (num[i] > max) max = num[i];
        }
        while (max / 10 != 0) {
            digits++;
            max = max / 10;
        }
        if (max % 10 != 0) {
            digits++;
        }
        return digits;
}

获得位数后我们从低位到到高位对数字进行分组排序,其中MyQueue为队列结构的类

public static void LSD(int[] num) {
        //对数字采用最低位优先法排序
        MyQueue queue = new MyQueue(10, num.length);//分配10个队列
        int digits = getNumDigits(num);
     
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值