12345678_0001
您的代码中存在多个问题:切片的初始化循环不正确。索引a应该分别从p和开始q+1。将它们更改为: for i in range(n1): L[i] = a[p+i] for j in range(n2): M[j] = a[q+1+j]或者简单地写: L = a[p..q+1] M = b[q+1..r+1]这使得qandr应该被排除在外而不是被包含在内是显而易见的。合并循环不正确:范围应该是range(p, r+1)并且一旦一个临时数组用完,比较指的是超出orL[i] <= M[j]边界的元素。LMq计算不正确merge_sort:它应该是q = (p + r) // 2测试if len(a) <= 1:不正确,您应该测试切片是否至少有 2 个元素,如果没有则什么也不做: if p < r: q = (p + r) // 2 merge_sort(a, p, q) merge_sort(a, q + 1, r) merge(a, p, q, r)这是一个排除了上限的修改版本:def merge(a, p, q, r): L = a[p..q] M = a[q..r] i = 0 j = 0 for k in range(p, r): if j >= len(M) or (i < len(L) and L[i] <= M[j]): a[k] = L[i] i += 1 else: a[k] = M[j] j += 1def merge_sort(a, p, r): if r - p > 1: q = p + (r - p) // 2 merge_sort(a, p, q) merge_sort(a, q, r) merge(a, p, q, r) a = [3,41,52,26,38,57,9,49]merge_sort(a, 0, len(a))for _ in range(len(a)): print('%d', a[_])