在大小不超过 N = ~1950 左右的较小列表上,我得到了正确的输出......但是,大小不大的列表会返回错误而不是预期的结果。我的代码:
def merge(left, right, aux=[]):
if left == []:
for x in right:
aux.append(x)
return aux
elif right == []:
for x in left:
aux.append(x)
return aux
elif left[0] > right[0]:
aux.append(right[0])
return merge(left, right[1:], aux)
else:
aux.append(left[0])
return merge(left[1:], right, aux)
def msort(values):
size = len(values)
if size == 1:
return values
else:
mid = size/2
return merge(msort(values[:mid]), msort(values[mid:]), [])
在这些测试列表上运行msort
会给我预期的(升序)输出:
val = [x for x in range(1950, 0, -1)
val = [x for x in range(4,0,-1)]
例如 [1,2,3,...,1948,1949,1950] 和 [1,2,3,4]
但是,当我msort
在这个测试用例上运行时:
val = [x for x in range(2000,0,-1)]
我现在收到此错误(经过多次回溯merge
):
RuntimeError: maximum recursion depth exceeded in cmp
所以我的问题是:我在这里的实现出了什么问题?我不能将它与 N ~ >=2000 的列表一起使用。为什么?