使用递归在Python中合并排序代码

使用递归在Python中合并排序代码,python,recursion,mergesort,Python,Recursion,Mergesort,下面是用Python编写的合并排序。它抛出一个错误“RuntimeError:超过最大递归深度”。如果我缺少结束递归的逻辑,请告诉我 list=[] list1=[] list2=[] def merge(list,list1,list2): for k in range(1,len(list1)+len(list2)): i=1 j=1 if list1[i]>list2[j]: list[k]=list2[j]

下面是用Python编写的合并排序。它抛出一个错误“RuntimeError:超过最大递归深度”。如果我缺少结束递归的逻辑,请告诉我

  list=[]
  list1=[]
  list2=[]
  def merge(list,list1,list2):

  for k in range(1,len(list1)+len(list2)):
    i=1
    j=1
    if list1[i]>list2[j]:
        list[k]=list2[j]
        j=+1
        k=+1
    else:
        list[k]=list2[i]
        i=+1
        k=+1


    def split(list,list1,list2):
if len(list)<>1:
    list1=list[:len(list)/2]
    list2=list[len(list)/2:]
return  


   def sort(list):
      split(list,list1,list2)
      sort(list1)
      sort(list2)
      merge(list,list1,list2)


      list = [15,8,59,69,45,23]
      sort(list)
list=[]
列表1=[]
列表2=[]
def合并(列表、列表1、列表2):
对于范围(1,len(列表1)+len(列表2))中的k:
i=1
j=1
如果列表1[i]>列表2[j]:
列表[k]=列表2[j]
j=+1
k=+1
其他:
列表[k]=列表2[i]
i=+1
k=+1
def拆分(列表、列表1、列表2):
如果len(列表)1:
列表1=列表[:len(列表)/2]
list2=列表[len(list)/2:]
返回
def排序(列表):
拆分(列表、列表1、列表2)
排序(列表1)
排序(列表2)
合并(列表、列表1、列表2)
列表=[15,8,59,69,45,23]
排序(列表)

在此脚本中避免全局变量初始化

>>> x = 5
>>> def show2():
...     x = 42
...     print x
... 
>>> show2()
42
>>> x
5
问题是,您使用相同的参数递归地调用自己,这保证了无限递归。不管你设置的递归限制有多高;您不能将其设置为超过无穷大。*

尝试此程序:

 def sort( aList ):
      aList = _mergesort( aList, 0, len( aList ) - 1 )
      return aList

def _mergesort( aList, first, last ):
  mid = ( first + last ) / 2
  if first < last:
    _mergesort( aList, first, mid )
    _mergesort( aList, mid + 1, last )

  a, f, l = 0, first, mid + 1
  tmp = [None] * ( last - first + 1 )

  while f <= mid and l <= last:
    if aList[f] < aList[l] :
      tmp[a] = aList[f]
      f += 1
    else:
      tmp[a] = aList[l]
      l += 1
    a += 1

  if f <= mid :
    tmp[a:] = aList[f:mid + 1]

  if l <= last:
    tmp[a:] = aList[l:last + 1]

  a = 0
  while first <= last:
    aList[first] = tmp[a]
    first += 1
    a += 1
  return aList

aList = [15,8,59,69,45,23]
print sort(aList)
def排序(列表):
aList=\u合并排序(aList,0,len(aList)-1)
返回列表
定义合并排序(列表、第一个、最后一个):
中间=(第一个+最后一个)/2
如果第一次<最后一次:
_合并排序(列表、第一、中间)
_合并排序(列表,中间+1,最后)
a、 f,l=0,第一,中间+1
tmp=[None]*(最后-第一+1)

而f不命名对象
列表
排序
。它们是内置的,您正在跟踪它们(这意味着您不能再使用内置的,因为它已被覆盖)。而我们其他人很难做到这一点follow@mhlester:
排序
可以。这是一种方法。如果对其进行阴影处理,则排序后的
会导致问题。对不起,您当然是对的。我只是不喜欢这样一个平淡无奇的名字。我不确定这是否只是因为代码的移动,但你的格式是不可靠的。把你的格式弄清楚绝对没什么坏处。是的。明白了。但是我如何在不定义变量的情况下使用它们呢?我是Python的初学者。我正在发布部分新代码和def拆分(seq,seq1,seq2):seq1=seq[:len(seq)/2]seq2=seq[len(seq)/2:]打印seq,seq1,seq2返回输出:[15,8,59,69,45,23][15,8,59][69,45,23]好的,我添加了合并排序的新程序。希望这会有帮助。