为什么我的合并排序程序不起作用?

问题描述

为什么我的合并排序程序不起作用?

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的索引应分别从pq+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]
    

    显而易见,qr应该排除在外,而不是包括在内。

  • 合并循环不正确:范围应为range(p,r+1),并且一旦其中一个临时数组用完后,比较L[i] <= M[j]就是指超出{{1}的边界的元素}或L

  • Mq中计算不正确:应该为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)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...