Python合并排序算法

Python合并排序算法,python,algorithm,sorting,debugging,mergesort,Python,Algorithm,Sorting,Debugging,Mergesort,嗨,我试图做一个有趣的合并排序算法,不想只是从互联网上复制代码。这就是为什么我没有提到其他人的堆栈溢出线程。因此,除非线程有相同的问题,请不要告诉我。我使用两个函数,合并和合并排序。合并排序是递归的,我希望它将列表一分为二,然后对每一半进行排序。然后,合并算法应该获取两个已排序的列表并返回一个新列表,即两个列表的组合和排序。最后,代码应该返回一个完全排序的列表。下面是我的代码,如果您运行它,您将看到返回的是一个空列表,这对我来说毫无意义。任何帮助都将不胜感激。谢谢:) def合并(左、右): 结

嗨,我试图做一个有趣的合并排序算法,不想只是从互联网上复制代码。这就是为什么我没有提到其他人的堆栈溢出线程。因此,除非线程有相同的问题,请不要告诉我。我使用两个函数,合并和合并排序。合并排序是递归的,我希望它将列表一分为二,然后对每一半进行排序。然后,合并算法应该获取两个已排序的列表并返回一个新列表,即两个列表的组合和排序。最后,代码应该返回一个完全排序的列表。下面是我的代码,如果您运行它,您将看到返回的是一个空列表,这对我来说毫无意义。任何帮助都将不胜感激。谢谢:)

def合并(左、右):
结果列表=[]
leastRight=0
leastLeft=0
如果len(左)>=len(右):
对于范围内的i(透镜(左)-1):
计数器=0
对于范围内的j(透镜(右)-1):
计数器+=1

如果正确[计数器%(len(right)-1)]很抱歉,但合并函数的方法根本不可用。选择最小元素的原则在这里太复杂,导致错误(我刚才看到它无法合并[6]和[0,2])。你读过关于合并的经典描述吗

mergesort
中(我们不能忽略对长度为2的列表的处理):

合并例程的快速工作实现

def merge(left, right):
    resultlist = []
    llen = len(left)
    rlen = len(right)
    il = 0
    ir = 0
    while il < llen and ir < rlen:  #while both list are not exhausted
        if left[il] <= right[ir]:    #choose the smallest current item
            resultlist.append(left[il])
            il += 1
        else:
            resultlist.append(right[ir])
            ir += 1
       #now treat the rest tail
    while il < llen:  
        resultlist.append(left[il])
        il += 1
    while ir < rlen:
        resultlist.append(right[ir])
        ir += 1
    return resultlist
注意,明智的做法是将
resultlist
设置为已知的速度长度

def merge(left, right):
    llen = len(left)
    rlen = len(right)
    resultlist = [0]*(llen+rlen) # we know data type and full length
    il = 0
    ir = 0
    k = 0
    while il < llen and ir < rlen:
        if left[il] <= right[ir]:
            resultlist[k] = left[il]
            il += 1
        else:
            resultlist[k] = right[ir]
            ir += 1
        k += 1
    while il < llen:
        resultlist[k] = left[il]
        il += 1
        k += 1
    while ir < rlen:
        resultlist[k] = right[ir]
        ir += 1
        k += 1
    return resultlist
def合并(左、右):
llen=len(左)
rlen=len(右)
结果列表=[0]*(llen+rlen)#我们知道数据类型和完整长度
il=0
ir=0
k=0
而il如果左[il]这似乎是一个更好的问题……如果它会引发类似建议,而不是在交换变量角色的情况下重复代码,则交换它们的值:
if len(left)>=len(right):left,right=right,left
def merge(left, right):
    resultlist = []
    llen = len(left)
    rlen = len(right)
    il = 0
    ir = 0
    while il < llen and ir < rlen:  #while both list are not exhausted
        if left[il] <= right[ir]:    #choose the smallest current item
            resultlist.append(left[il])
            il += 1
        else:
            resultlist.append(right[ir])
            ir += 1
       #now treat the rest tail
    while il < llen:  
        resultlist.append(left[il])
        il += 1
    while ir < rlen:
        resultlist.append(right[ir])
        ir += 1
    return resultlist
>>> mergesort [0, 1, 2, 6, 8, 9]
def merge(left, right):
    llen = len(left)
    rlen = len(right)
    resultlist = [0]*(llen+rlen) # we know data type and full length
    il = 0
    ir = 0
    k = 0
    while il < llen and ir < rlen:
        if left[il] <= right[ir]:
            resultlist[k] = left[il]
            il += 1
        else:
            resultlist[k] = right[ir]
            ir += 1
        k += 1
    while il < llen:
        resultlist[k] = left[il]
        il += 1
        k += 1
    while ir < rlen:
        resultlist[k] = right[ir]
        ir += 1
        k += 1
    return resultlist