python3合并两个列表并排序,python合并两个有序列表

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: