Python:我无法获得正确的合并排序

Python:我无法获得正确的合并排序,python,recursion,Python,Recursion,我编写了以下程序;运行后,结果不正确。 那么我的代码有什么问题 def mergesort(list1): if len(list1) > 1: mid = len(list1) // 2 left_list = list1[:mid] right_list = list1[mid:] mergesort(left_list) mergesort(right_list) i = 0 # left

我编写了以下程序;运行后,结果不正确。 那么我的代码有什么问题

def mergesort(list1):
    if len(list1) > 1:
        mid = len(list1) // 2
        left_list = list1[:mid]
        right_list = list1[mid:]
        mergesort(left_list)
        mergesort(right_list)
    i = 0 # left
    j = 0 # right
    k = 0 # total
    while len(list1) > 1 and i < len(left_list) and j < len(right_list):
        if left_list[i] < right_list[j]:
            list1[k] = left_list[i]
            k += 1
            i +=1
        else:
            list1[k] = right_list[i]
            k += 1
            j += 1
    if len(list1) > 1 and i < len(left_list):
        list1[k] = left_list[i]
        i += 1
        k += 1
    if len(list1) > 1 and j < len(right_list):
        list1[k] = right_list[j]
        k += 1
        j += 1
    return list1
        
ex = [3, 5, 9, 0, 8, 7]     
mergesort(ex)
def合并排序(列表1):
如果len(列表1)>1:
mid=len(列表1)//2
左列表=列表1[:中间]
右列表=列表1[mid:]
合并排序(左列表)
合并排序(右列表)
i=0#左
j=0#对
k=0#总计
而len(列表1)>1和i1且i1且j
结果:[0,3,5,7,7,9]

我发现了三个问题

  • 您没有从
    mergesort(左列表)
    mergesort(右列表)
    获得结果(但这甚至可以工作,因为它会替换原始列表中的值)

  • 您在一个位置使用了
    i
    而不是
    j

  • 您在两个位置使用了
    if
    istead of
    ,而


  • def合并排序(列表1):
    如果len(列表1)>1:
    mid=len(列表1)//2
    左列表=列表1[:中间]
    右列表=列表1[mid:]
    左列表=合并排序(左列表)#1。得到结果
    右列表=合并排序(右列表)#1。得到结果
    i=0#左
    j=0#对
    k=0#总计
    而len(列表1)>1和i1和i1和j
    我发现了三个问题

  • 您没有从
    mergesort(左列表)
    mergesort(右列表)
    获得结果(但这甚至可以工作,因为它会替换原始列表中的值)

  • 您在一个位置使用了
    i
    而不是
    j

  • 您在两个位置使用了
    if
    istead of
    ,而


  • def合并排序(列表1):
    如果len(列表1)>1:
    mid=len(列表1)//2
    左列表=列表1[:中间]
    右列表=列表1[mid:]
    左列表=合并排序(左列表)#1。得到结果
    右列表=合并排序(右列表)#1。得到结果
    i=0#左
    j=0#对
    k=0#总计
    而len(列表1)>1和i1和i1和j
    合并排序有3个不同的步骤:基本大小写、递归步骤和合并步骤。合并步骤通常作为一个单独的函数编写,但这里我将其合并到merge_sort函数中,以与代码保持一致。您最大的问题是没有将子列表进行递归排序并合并它们

    def mergesort(list1):
        #base case
        if len(list1) <= 1:
            return list1
    
        #recursive step
        mid = len(list1) // 2
        left_list = list1[:mid]
        right_list = list1[mid:]
        sorted_left = mergesort(left_list)
        sorted_right = mergesort(right_list)
    
        #merge step
        result = []
        while len(sorted_left) > 0 and len(sorted_right) > 0:
            if sorted_left[0] <= sorted_right[0]:
                result.append(sorted_left.pop(0))
            elif sorted_right[0] <= sorted_left[0]:
                result.append(sorted_right.pop(0))
            else:
                result.append(sorted_left.pop(0))
                result.append(sorted_right.pop(0))
    
        result = result + sorted_left + sorted_right
        return result
    
    print(mergesort([3,5,1,9,7])) #output: [1, 3, 5, 7, 9]
    
    def合并排序(列表1):
    #基本情况
    如果len(列表1)0和len(排序右)>0:
    
    如果按左[0]排序,则合并排序有3个不同的步骤:基本大小写、递归步骤和合并步骤。合并步骤通常作为一个单独的函数编写,但这里我将其合并到merge_sort函数中,以与代码保持一致。您最大的问题是没有将子列表进行递归排序并合并它们

    def mergesort(list1):
        #base case
        if len(list1) <= 1:
            return list1
    
        #recursive step
        mid = len(list1) // 2
        left_list = list1[:mid]
        right_list = list1[mid:]
        sorted_left = mergesort(left_list)
        sorted_right = mergesort(right_list)
    
        #merge step
        result = []
        while len(sorted_left) > 0 and len(sorted_right) > 0:
            if sorted_left[0] <= sorted_right[0]:
                result.append(sorted_left.pop(0))
            elif sorted_right[0] <= sorted_left[0]:
                result.append(sorted_right.pop(0))
            else:
                result.append(sorted_left.pop(0))
                result.append(sorted_right.pop(0))
    
        result = result + sorted_left + sorted_right
        return result
    
    print(mergesort([3,5,1,9,7])) #output: [1, 3, 5, 7, 9]
    
    def合并排序(列表1):
    #基本情况
    如果len(列表1)0和len(排序右)>0:
    
    如果排序为左[0],最好使用
    print()
    查看代码中不同时刻变量中的值,并将其与纸面计算进行比较。通过这种方式,您可以找到问题所在。此时,我看到一个问题—您运行
    mergesort(左列表)
    mergesort(右列表)
    ,但您没有得到结果-
    result\u left=mergesort(左列表)
    results\u right=mergesort(右列表)
    —并且您没有使用它们;最好使用
    print()
    在代码的不同时刻查看变量中的值,并将其与纸上的计算进行比较。通过这种方式,您可以找到问题所在。此时,我看到一个问题—您运行
    mergesort(左列表)
    mergesort(右列表)
    ,但您没有得到结果-
    result\u left=mergesort(左列表)
    results\u right=mergesort(右列表)
    —并且您没有使用它们;这很有帮助,你在合并和递归步骤中的设计很棒~~我正在学习。;多谢各位!你在合并和递归步骤中的设计太棒了~~我正在学习。;多谢各位!多谢各位,;我忘了保存结果;然而,它被放在列表1中;也许这不会造成问题;经过一步一步的测试,,