-1

我这里有一个使用合并排序对列表进行排序的代码。我只是在网络的某个地方得到了它。但老实说,我无法遵循代码的流程......我的意思是,我不明白它是怎么回事实施的。我可以理解某些部分,尤其是第一个部分,它将整个列表一分为二,然后对列表的每一侧进行排序。然后什么??请你告诉这里发生了什么?谢谢你。:)

def merge(badlist):
    if len(badlist) == 1:  
    return badlist  
    m = len(badlist)/2  
    l = merge(badlist[:m])  
    r = merge(badlist[m:])  
    if not len(l) or not len(r):  
        return l or r  
    result = []  
    i = j = 0  
    while (len(result) < len(r) + len(l)):  
        if l[i] < r[j]:  
            result.append(l[i])  
            i += 1  
        else:  
            result.append(r[j])  
            j += 1  
        if i == len(l) or j == len(r):  
            result.extend(l[i:] or r[j:]) 
            break  
    return result  
print merge(badlist)  
4

1 回答 1

1

一行一行的走,

if not len(l) or not len(r):  
        return l or r

这将检查任何一个列表是否为空。如果是,则返回另一个列表。

result = []  
i = j = 0  

这里, result, i,j被初始化

while (len(result) < len(r) + len(l)):  

运行while循环,直到两个列表的所有元素都已复制到result列表中。

    if l[i] < r[j]:  
            result.append(l[i])  
            i += 1  
    else:  
            result.append(r[j])  
            j += 1  

该块检查哪个l[i]r[j]更小,然后将其附加到result,并推进相应的计数器。这一直持续到任何一个列表完全用完,这在以下代码块中进行检查:

    if i == len(l) or j == len(r):  
            result.extend(l[i:] or r[j:]) 
            break 

现在,无论哪个列表仍然包含元素,都按原样附加到result列表的末尾。

return result

之后result返回。

如前所述,您的示例中的缩进不正确,我已在此处更正。

于 2013-02-05T07:47:32.773 回答