python3合并两个列表并排序,python合并两个有序列表
假设有两个有序列表l1和l2。如何高效合并两个列表,并保持有序?这里,默认顺序是正顺序。
想法比较简单。无非就是依次比较l1和l2头的第一个元素,把较小的放在一个新的列表里,以此类推,直到所有的元素都放在新的列表里。
考虑两个列表L1=[2]和L2=[1]。你如何合并它们?(注意:以下实现将改变l1和l2的原始值)
代码如下:
def signle_merge_sort(l1,l2):
tmp=[]
如果l1[0] l2[0]:
tmp.append(l1[0])
tmp .扩展(l2)
del l2[0]
否则:
tmp.append(l2[0])
tmp .扩展(l1)
del l1[0]
返回tmp
这个只能处理一个元素的情况,解决不了问题,但至少我们有个大概的思路。如果列表中有2个元素,上述方法将不起作用。我们需要解决边界判断问题,即当l1或l2中有一个为空时,将剩余列表加到排序结果的末尾。然后确保函数每次调用只处理一个元素,通过递归解决问题。
代码如下:
def recursion_merge_sort1(l1,l2):
tmp=[]
如果len(l1)==0:
tmp .扩展(l2)
返回tmp
elif len(l2)==0:
tmp .扩展(l1)
返回tmp
否则:
如果l1[0] l2[0]:
tmp.append(l1[0])
del l1[0]
否则:
tmp.append(l2[0])
del l2[0]
tmp=递归合并排序1(l1,l2)
返回tmp
上面的程序有两个问题:if判断太多;每次都要初始化tmp,似乎对内存使用不太友好。考虑到程序在l1或l2为空时终止,您可以稍微重写一下:
代码如下:
def _recursion_merge_sort2(l1,l2,tmp):
如果len(l1)==0或len(l2)==0:
tmp .扩展(l1)
tmp .扩展(l2)
返回tmp
否则:
如果l1[0] l2[0]:
tmp.append(l1[0])
del l1[0]
否则:
tmp.append(l2[0])
del l2[0]
return _ recursion _ merge _ sort 2(L1,l2,tmp)
def recursion_merge_sort2(l1,l2):
return _ recursion _ merge _ sort 2(L1,l2,[])
但是对于Python来说,即使是尾部递归也没有那么高效。为了避免堆栈爆炸,通常是通过循环来完成的。稍微改写一下:
代码如下:
def loop_merge_sort(l1,l2):
tmp=[]
而len(l1) 0和len(l2) 0:
如果l1[0] l2[0]:
tmp.append(l1[0])
del l1[0]
否则:
tmp.append(l2[0])
del l2[0]
tmp .扩展(l1)
tmp .扩展(l2)
返回tmp
今天栽了个坑,反思一下,就这样。
这篇技术文章来自互联网。如果您无意侵犯您的权益,请点击此处反馈版权投诉。
系统来源:php中文网
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。