使用递归在Python中合并排序代码
下面是用Python编写的合并排序。它抛出一个错误“RuntimeError:超过最大递归深度”。如果我缺少结束递归的逻辑,请告诉我使用递归在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]
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]好的,我添加了合并排序的新程序。希望这会有帮助。