递归排序两个单独的列表

时间:2015-05-06 07:28:22

标签: python sorting recursion

定义名为sort的递归函数;它通过任何无序列表;它返回一个新列表(不改变参数),该列表包含参数列表中的每个值,但是以非降序排列。

例如,调用sort([4,5,3,1,6,7,2])会在列表[4,5,3][1,6,7,2]上递归调用排序,分别返回列表[3,4,5][1,2,6,7],这些列表在合并时将返回列表[1,2,3,4,5,6,7]

注意当列表的长度是偶数时,两个子列表都将具有相同的长度 尺寸;当列表的长度为奇数时,将其分成两个列表是很自然的,第一个列表的值比第二个列表少。

该功能如下所示:

def sort(l):

我知道如何将l分成两个列表,例如[4,5,3,1,6,7,2],我将它们分为[4,5,3][1,6,7,2]。但是当sort函数只有一个参数l时,我真的不知道如何递归排序每一半。

有人可以告诉你这样做吗?谢谢。

1 个答案:

答案 0 :(得分:0)

我试了一下它似乎有效。就像TobiasR说的那样,它是一种合并类型。如果您想要更好地解释它的工作原理,我可以查看this video on merge sorts by Harvard University。 无论如何,这是它的代码:

def sort(l):
    if len(l)==2:
        if l[0]<l[1]:
            return l #return list as it is
        return l[::-1] #return reversed list
    elif len(l)==1:
        return l
    l_1=sort(l[:len(l)//2]) # cut the list in half
    l_2=sort(l[len(l)//2:])
    l_out=[]
    while True:
        if not l_1: #check l1 isn't empty
            l_out+=l_2
            break;
        elif not l_2: #check l2 isn't empty
            l_out+=l_1
            break;
        if l_1[0]<l_2[0]: #put the smallest item in the list
            l_out.append(l_1.pop(0))
        else:
            l_out.append(l_2.pop(0))
    return l_out