【问题标题】:Recursive merge sort doesn't work correctly递归合并排序无法正常工作
【发布时间】:2023-03-22 00:12:02
【问题描述】:

我编写了一个应该执行递归合并排序的程序,我首先创建了一个fusion 方法来使用索引合并两个列表

这里是fusion 方法

def Fusion (L,d,f,m):
  aux=[]
  i_d=d
  i_m=m
  while (i_d<=m-1 and i_m<=f-1):
    if(L[i_d]<=L[i_m]):
        aux.append(L[i_d])
        i_d+=1
    else:
        aux.append(L[i_m])
        i_m+=1
  while (i_d<=m-1):
    aux.append(L[i_d])
    i_d+=1
  while (i_m<=f-1):
    aux.append(L[i_m])
    i_m+=1
  for j in range(len(aux)):
    L[j]=aux[j]

这个方法工作正常,我用两个排序列表测试过。

merge 方法在这里

 def sort_fusion(T,a,b):
  if (a<b):
    m=(a+b)//2
    sort_fusion(T,a,m) 
    sort_fusion(T,m+1,b)
    Fusion(T,a,b,m)  

运行程序

k1 =[3,1,0,9,1,2,6,8,5,7]
a=0
b=len(k1)
sort_fusion(k1,a,b)

程序给出这个[2, 5, 6, 6, 7, 8, 1, 8, 5, 7]作为输出给出这个输入[3, 1, 0, 9, 1, 2, 6, 8, 5, 7]

我无法理解程序的行为,当我评论 sort_fusion(T,m+1,b) 指令时,它给了我这个 [0, 1, 2, 3, 6, 8, 5, 7, 9, 1] 作为输出,对我来说,算法很好,当我跟踪它的进度时。

谁能指出问题所在。

【问题讨论】:

    标签: python sorting recursion


    【解决方案1】:
    L[j]=aux[j]
    

    这里,你可能需要

    L[j + d] = aux[j]
    

    原因是您从 L 中获取值,该值从索引 d 开始。当你把辅助数组写回 L 时,你想把数字写到同一个地方。

    【讨论】:

    • 您是否尝试将Fusion 末尾的L[j] 更改为L[j + d]?这应该可以修复您的代码。
    猜你喜欢
    • 2013-09-17
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 2016-04-30
    • 2015-09-23
    • 2022-01-19
    • 2015-11-11
    • 1970-01-01
    相关资源
    最近更新 更多