MergeSort递归实现

2024-04-26 20:23:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我今天刚刚学习了Python,正在尝试递归实现Mergesort。。。我完全搞不清楚我做错了什么。有人能帮忙吗?你知道吗

def mergesort(A):

    if len(A) < 2:
        return A
    middle = len(A) // 2
    L = mergesort(A[:middle])
    R = mergesort(A[middle:])
    return merge(L, R)

# Merge - combine part of mergesort

def merge(Lsort, Rsort):


sort = [None] * (len(Lsort + Rsort))


i = 0
j = 0
k = 0 
while (len(Lsort) <= len(sort)) or (len(Rsort) <= len(sort)):
    if Lsort[i] < Rsort[j]:
        sort[k] = Lsort[i]
        i += 1
    else:
        sort[k] = Rsort[j]
        j += 1
    k += 1
return sort

Tags: ofmiddlelenreturnifdefmergesort
3条回答

这与Python无关,而是与逻辑有关。你知道吗

while表达式更改为

while k < len(sort):

if表达式

if (j >= len(Rsort)) or (i < len(Lsort) and Lsort[i] < Rsort[j]):

以下是http://interactivepython.org/runestone/static/pythonds/SortSearch/TheMergeSort.html提供的Python版本

(注意下面我在一个示例列表上粘贴了一个应用程序流的图像,这是为了帮助我理解递归流(因为我是nube))。你知道吗

MergeSortPython code

example MergeSort flow

合并函数就是问题所在,应该更像:

def merge(Lsort, Rsort):                                                                                                                                                                                    
    sort = []                                                                                                                                                                                               

    i = 0                                                                                                                                                                                                   
    j = 0                                                                                                                                                                                                   
    while (len(Lsort) > i) & (len(Rsort) > j):                                                                                                                                                              
        if Lsort[i] < Rsort[j]:                                                                                                                                                                             
            sort.append(Lsort[i])                                                                                                                                                                           
            i += 1                                                                                                                                                                                          
        else:                                                                                                                                                                                               
            sort.append(Rsort[j])                                                                                                                                                                           
            j += 1                                                                                                                                                                                          

    if len(Lsort) > 0:                                                                                                                                                                                      
        sort += Lsort[i:]                                                                                                                                                                                   

    if len(Rsort) > 0:                                                                                                                                                                                      
        sort += Rsort[j:]                                                                                                                                                                                   

    return sort

一般来说,您不需要为排序分配空间,只需在运行时附加到空列表中即可。对于while逻辑,您需要确保没有超出Lsort和Rsort数组的界限。确保索引小于数组长度。你知道吗

当任一数组用完时,您可以将剩余的数组项连接到排序列表中。你知道吗

相关问题 更多 >