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

归并排序统计移位次数时单个数组计算结果错误问题求助

问题原因

你的代码统计移位次数的核心逻辑存在计算错误:
当右半部分元素小于左半部分当前指针位置的元素时,实际需要累加的移位次数是左半部分剩余未处理的所有元素的数量,也就是左半部分总长度 - 左指针当前位置,或者等价的len(left[x:])。你在原有代码中多减了一次左指针x,导致计数结果偏小。

原错误代码行:

count += len(left[x:])-x

修复方法

将上述代码行修改为以下任意一种即可:

# 写法1:计算效率更高,不需要切片
count += len(left) - x

# 写法2:和你原有写法逻辑一致,去掉多余的减x操作
count += len(left[x:])

补充说明

你当前的归并流程没有将遍历结束后剩余的左/右半部分元素追加到结果数组中,如果你只需要统计移位次数,这部分逻辑不影响最终计数结果;如果你后续需要返回排序后的数组,需要在while循环结束后补充以下代码:

result.extend(left[x:])
result.extend(right[y:])

修改后完整可运行代码

def mergeSort(arr):
    count = x = y = 0
    result =[]
    arrayLength = len(arr)

    if arrayLength <= 1:
        return count
    
    middle = arrayLength // 2
    left = arr[:middle]
    right = arr[middle:]

    leftLength = len(left)
    rightLength = len(right)

    count += mergeSort(left) 
    count += mergeSort(right)
    
    while x < leftLength and y < rightLength:
        if left[x] <= right[y]:
            result.append(left[x])
            x += 1
        else:
            result.append(right[y])
            y += 1
            # 修复后的计数逻辑
            count += len(left) - x
    # 若需要返回排序后数组,取消注释下方两行
    # result.extend(left[x:])
    # result.extend(right[y:])
    return count


arr = [1,20,6,4,5]
print(mergeSort(arr))

arr2 = [4,3,2,1]
print(mergeSort(arr2))

arr3=[1, 1, 1, 2, 2]
print(mergeSort(arr3))

arr4=[2, 1, 3, 1, 2]
print(mergeSort(arr4))

arr5 = [12,15,1,5,6,14,11]
print(mergeSort(arr5))

arr6=[3, 5, 7, 11, 9]
print(mergeSort(arr6))

修改后你提到的返回值为3的测试数组[2, 1, 3, 1, 2]会正确输出4,符合预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:45:00