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

Python归并排序实现报错求助:IndexError索引越界问题

问题分析与修复

错误1:空列表直接赋值索引导致越界

你初始化arr1 = []和arr2 = []后,直接用arr1[i] = arr[s+i]赋值会触发索引越界错误——空列表没有对应的索引位置,Python不支持这种赋值方式。解决办法要么提前初始化列表的固定长度,要么用append()方法添加元素。

错误2:mergeSort调用的终止索引错误

原代码调用mergeSort(arr,0,len(arr)),但数组的最后一个有效索引是len(arr)-1,传入len(arr)会导致递归时处理超出数组范围的位置,引发后续逻辑错误。


修复后的代码

def mergeSort(arr, s, e):
    if s >= e:
        return
    mid = s + (e - s) // 2
    mergeSort(arr, s, mid)
    mergeSort(arr, mid + 1, e)
    merge(arr, s, mid, e)


def merge(arr, s, mid, e):
    # 提前初始化子数组长度,避免索引赋值错误
    n = mid - s + 1
    m = e - mid
    arr1 = [0] * n
    arr2 = [0] * m
    
    for i in range(n):
        arr1[i] = arr[s + i]
    for i in range(m):
        arr2[i] = arr[mid + i + 1]
    
    i = j = 0
    k = s
    while i < len(arr1) and j < len(arr2):
        if arr1[i] < arr2[j]:
            arr[k] = arr1[i]
            i += 1
        else:
            arr[k] = arr2[j]
            j += 1
        k += 1
    
    while i < len(arr1):
        arr[k] = arr1[i]
        i += 1
        k += 1
    
    while j < len(arr2):
        arr[k] = arr2[j]
        j += 1
        k += 1


arr = [1,5,0,3,-15,99,1500,-1500,66,120]
mergeSort(arr, 0, len(arr)-1)  # 修正终止索引为len(arr)-1
print(arr)

更Pythonic的写法参考

利用Python切片特性简化代码,省去手动填充子数组的循环:

def mergeSort(arr):
    if len(arr) <= 1:
        return arr
    mid = len(arr) // 2
    left = mergeSort(arr[:mid])
    right = mergeSort(arr[mid:])
    return merge(left, right)

def merge(left, right):
    result = []
    i = j = 0
    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1
    result.extend(left[i:])
    result.extend(right[j:])
    return result

arr = [1,5,0,3,-15,99,1500,-1500,66,120]
sorted_arr = mergeSort(arr)
print(sorted_arr)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 00:42:25