递归合并排序与非递归合并

问题描述

我正在尝试编写递归合并排序算法,但是我的合并算法不是递归的。

有人告诉我在下面的函数中使用以下参数来做到这一点。

def merge(left_buffer,right_buffer,data):
    
    "Merges two sets of data together by comparison"
    print("MERGING",left_buffer,"and",right_buffer)
    #Dual iteration
    m = 1
    n = 1
    k = 0
    j = 0
    for i in range(len(data)):
        if len(left_buffer) == 0:
            data[i] = right_buffer[k]
            k+=1
        elif len(right_buffer) == 0:
            data[i] = left_buffer[j]
            j += 1
        elif left_buffer[0] < right_buffer[0]:
            data[i] = left_buffer[0]
            left_buffer = left_buffer[1:]
            
        else:
            data[i] = right_buffer[0]
            right_buffer = right_buffer[1:]
    print('Result of the merge:',data)

这是我将两个数据集合并成另一个数据集的功能

然后是我的递归归并排序算法:

def merge_sort(data):
    "Merge sort recursion"
    if len(data) == 1:
        return [data[0]]
    else:
        half_length = len(data)//2
        left_half = data[0:half_length]
        right_half = data[half_length:]
        
        #Only sorting the left side
        left = merge_sort(left_half)
        right = merge_sort(right_half)
        
        return merge(left,right,data)


我收到的主要问题是,在两个列表的最终合并时,我发现我正在合并 None 类型。

我不知道如何解决这个问题。

也许我的合并算法不正确,但我的导师说没问题。

解决方法

您的 merge 方法不返回任何内容,因此当您的 merge_sort 方法返回时,它也会返回 None

这些 None 值被传递到 leftright,然后您将它们传递到您的 merge 方法中。

也许您希望您的 merge_sort 方法进行合并,然后返回合并后的数据?即:

    merge(left,right,data)
    return data

或者,您可以修改 merge 使其返回合并的数据,方法是在其末尾添加行 return data