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