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

修复归并排序实现错误,解决游戏高分榜排序崩溃及排序需求

问题解决与代码修正

崩溃原因

你定义了两个同名的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 00:41:13