我正在尝试创建一个递归函数以将列表从低到高排序。 以下代码不起作用
less = []
greater = []
def quicksort(array):
if len(array)<2:
return array
else:
pivot = array[0]
for i in array[1:]:
if i <= pivot:
less.append(i)
else:
greater.append(i)
return quicksort(less)+[pivot]+quicksort(greater)
print(quicksort([1,3,2,7,8]))
但是我使用书代码,它可以工作。你能告诉我为什么吗?
def quicksort(array):
if len(array)<2:
return array
else:
pivot = array[0]
less = [i for i in array[1:] if i <= pivot]
greater = [i for i in array[1:] if i > pivot]
return quicksort(less)+[pivot]+quicksort(greater)
print(quicksort([1,3,2,7,8]))
答案 0 :(得分:2)
您正在使用 global less
和greater
list
s,因此最终将建立list
s越来越大,多次重复输入(大致与您递归调用quicksort
的次数成正比)。 less
和greater
不断增长,直到您突破堆栈深度限制或内存不足,Python死了以保护自己免受侵害。
更糟糕的是,您保留了调用之间的状态,因此quicksort
的第二件事和后续事情最终包括了先前排序操作中的垃圾,即使它们在输入上是如此之短,您也可以对其进行琐碎的“排序”。如果将less
/ greater
设置为本地,并在每次调用中重新初始化它们,则代码将起作用:
def quicksort(array):
if len(array)<2:
return array
else:
pivot = array[0]
less = [] # Local!
greater = [] # Local!
for i in array[1:]:
if i <= pivot:
less.append(i)
else:
greater.append(i)
return quicksort(less)+[pivot]+quicksort(greater)