问题描述
为什么我的合并排序程序不起作用?
def merge(a,p,q,r):
n1 = (q - p) + 1
n2 = r - q
L = [0] * n1
M = [0] * n2
for i in range(n1):
L[i] = a[i]
for j in range(n2):
M[j] = a[j]
i = 0
j = 0
for k in range(p,r):
if L[i] <= M[j]:
a[k] = L[i]
i += 1
else:
a[k] = M[j]
j += 1
def merge_sort(a,r):
if len(a) <= 1:
print('list has only one element')
else:
q = len(a) // 2
merge_sort(a,q)
merge_sort(a,q + 1,r)
merge(a,r)
a = [3,41,52,26,38,57,9,49]
merge_sort(a,len(a) - 1)
for _ in range(len(a)):
print('%d',a[_])
解决方法
您的代码中存在多个问题:
-
切片的初始化循环不正确。
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]
显而易见,
q
和r
应该排除在外,而不是包括在内。 -
合并循环不正确:范围应为
range(p,r+1)
,并且一旦其中一个临时数组用完后,比较L[i] <= M[j]
就是指超出{{1}的边界的元素}或L
。 -
M
在q
中计算不正确:应该为merge_sort
-
测试
q = (p + r) // 2
不正确,您应该测试切片是否至少包含2个元素,如果没有,则不执行任何操作:if len(a) <= 1:
以下是修改后的版本,其中排除了上限:
if p < r:
q = (p + r) // 2
merge_sort(a,p,q)
merge_sort(a,q + 1,r)
merge(a,q,r)