You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python3中按最高有效位升序排列列表?

按最高有效位升序排列列表(MSD基数排序修复方案)

你的代码存在几个关键问题导致无法得到预期结果:

  • sortmsd函数没有返回值,调用后无法获取排序后的列表;
  • 当前实现并非正确的MSD(最高位优先)基数排序——MSD需要按当前位分组后,对每个分组递归处理下一位,而非全局重复排序;
  • 处理不同位数的数字时,高位逻辑错误,导致短位数数字被错误归类,无法和同最高位的长位数数字归为一组。

下面是修复后的MSD基数排序代码,完全符合你的预期输出:

def msd_radix_sort(lst):
    if not lst:
        return lst
    
    # 获取最大数字的位数,确定需要处理的最高位
    max_num = max(lst)
    max_digits = len(str(max_num))
    
    def sort_helper(arr, digit_pos):
        if digit_pos < 0 or len(arr) <= 1:
            return arr
        
        # 初始化10个桶,对应0-9
        buckets = [[] for _ in range(10)]
        divisor = 10 ** digit_pos
        
        for num in arr:
            # 计算当前位的数字,短位数数字高位补0
            digit = (num // divisor) % 10
            buckets[digit].append(num)
        
        # 对每个桶递归处理下一位,然后合并结果
        sorted_result = []
        for bucket in buckets:
            sorted_result.extend(sort_helper(bucket, digit_pos - 1))
        
        return sorted_result
    
    return sort_helper(lst, max_digits - 1)

# 测试示例
original_list = [237, 146, 259, 348, 152, 163, 235, 48, 36, 62, 147]
sorted_list = msd_radix_sort(original_list)
print(sorted_list)
# 输出:[146, 147, 152, 163, 235, 237, 259, 348, 36, 48, 62]

代码说明

  • 递归分组处理:sort_helper函数负责按当前位分组,然后对每个桶递归处理下一位,保证MSD的排序逻辑——先按最高位排序,同组内再按次高位排序,以此类推。
  • 高位补零模拟:通过divisor = 10 ** digit_pos计算当前位的除数,短位数数字在高位计算时会得到0,确保排序时的位数对齐。
  • 返回排序结果:主函数msd_radix_sort返回最终的排序后的列表,避免原代码无返回值的问题。

如果你只是需要快速实现该排序逻辑,也可以直接利用字符串字典序排序(效果和预期一致):

original_list = [237, 146, 259, 348, 152, 163, 235, 48, 36, 62, 147]
sorted_list = sorted(original_list, key=lambda x: str(x))
print(sorted_list)
# 输出同样符合预期

内容的提问来源于stack exchange,提问作者Krushna Dharaskar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:50:24