【问题标题】:How to correctly write a merge sort algorithm with the use of a temporary list如何使用临时列表正确编写归并排序算法
【发布时间】:2022-11-30 14:00:27
【问题描述】:

我正在写一个带递归的合并排序,但它没有打印出正确的消息,但是当我手写代码时,它似乎是正确的。谁能帮我找出原因?

def mergeSort1(arr):
  
  if len(arr)<=1:  #base case
    return arr
  else :
    breakN =len(arr)//2
    left = arr[:breakN]
    right = arr[breakN:]
    mergeSort1(left)
    mergeSort1(right)
    i=j=0
    temp = []
    while i<len(left) and j<len(right):
      if left[i] <= right[j]:
        temp.append(left[i])
        i += 1
      else:
        temp.append(right[j])
        j += 1
    while i < len(left): # extend the list in case there's any missing
      temp.append(left[i])
      i += 1
    while j < len(right):
      temp.append(right[j])
      j += 1
    #print(temp)
    return temp

获取结果的代码:

arr = [9,7,3,6,2]
mergeSort1(arr)
print(arr)

结果:

[9, 7, 3, 6, 2]

后来看了看别人的代码,发现问题可能出在temp[],于是在else语句的后面加了一个print(temp)(见上面代码),打印出来如下:

[7, 9]
[2, 6]
[3, 6, 2]
[3, 6, 2, 9, 7]

它显示第一个和第二个答案是我想要的,有人可以帮我找出原因吗?

【问题讨论】:

    标签: python recursion data-structures mergesort


    【解决方案1】:

    由于您没有就地修改输入列表而是返回一个新列表,因此您应该将函数的返回值分配给一个变量。

    改变:

    mergeSort1(left)
    mergeSort1(right)
    

    至:

    left = mergeSort1(left)
    right = mergeSort1(right)
    

    并改变:

    mergeSort1(arr)
    print(arr)
    

    至:

    print(mergeSort1(arr))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多