为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

湖上湖 2023-06-20 17:33:03
为什么我的归并排序程序不工作?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 += 1def merge_sort(a, p, r):    if len(a) <= 1:        print('list has only one element')    else:        q = len(a) // 2        merge_sort(a, p, q)        merge_sort(a, q + 1, r)        merge(a, p, q, r)        a = [3,41,52,26,38,57,9,49]merge_sort(a, 0, len(a) - 1)for _ in range(len(a)):    print('%d', a[_])
查看完整描述

1 回答

?
12345678_0001

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[_])


查看完整回答
反对 回复 2023-06-20
  • 1 回答
  • 0 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信