1 回答
TA贡献1802条经验 获得超5个赞
您的代码中存在多个问题:
切片的初始化循环不正确。索引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]边界的元素。LM
q计算不正确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 += 1
def 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[_])
添加回答
举报