如何在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
相关产品推荐
相关产品推荐

