修复归并排序实现错误,解决游戏高分榜排序崩溃及排序需求
问题解决与代码修正
崩溃原因
你定义了两个同名的sort函数,第二个接收left和right参数的函数覆盖了第一个仅接收data的函数,导致调用sort(self.score_data)时,实际调用的是需要两个参数的版本,因此抛出TypeError: sort() missing 1 required positional argument: 'right'。
核心修改点
- 重命名合并函数:将负责合并两个子数组的
sort函数改为merge,避免函数名冲突。 - 修复主排序函数逻辑:
- 当数组长度小于等于1时直接返回原数组(递归终止条件);
- 递归拆分后调用合并函数,并且要返回合并后的结果,否则递归过程中无法传递排序后的数组。
- 修复合并函数逻辑:原代码的while循环未比较左右子数组的元素大小,只会无脑添加左数组元素,需要改为按分数比较后添加对应元素;同时修正剩余元素的处理逻辑。
- 适配高分榜排序规则:比较元素时,使用子列表的第0位(分数)进行大小判断,支持按分数排序(默认降序,若需要升序可调整比较符号)。
修正后的完整代码
def sort(data): # 递归终止条件:数组长度<=1时直接返回 if len(data) <= 1: return data midpoint = len(data) // 2 left = sort(data[:midpoint]) right = sort(data[midpoint:]) # 调用合并函数并返回结果 return merge(left, right) def merge(left, right): result = [] left_pointer = right_pointer = 0 # 按分数比较左右子数组元素,依次加入结果 while left_pointer < len(left) and right_pointer < len(right): # 按分数降序排序,若要升序改为 < if left[left_pointer][0] >= right[right_pointer][0]: result.append(left[left_pointer]) left_pointer += 1 else: result.append(right[right_pointer]) right_pointer += 1 # 加入剩余未处理的元素 result.extend(left[left_pointer:]) result.extend(right[right_pointer:]) return result # 测试高分榜数据 test_data = [[100, "Alice"], [200, "Bob"], [150, "Charlie"]] print(sort(test_data)) # 输出:[[200, 'Bob'], [150, 'Charlie'], [100, 'Alice']]
额外说明
- 若需要升序排序,只需将
merge函数中的比较符号从>=改为<即可。 - 归并排序的时间复杂度为O(n log n),符合高分榜对高效排序的需求,也可以替换为快速排序(同为O(n log n)复杂度,实际场景中平均性能更优)。
内容的提问来源于stack exchange,提问作者HarveyF2003
相关产品推荐
相关产品推荐

