【发布时间】:2018-06-09 14:07:40
【问题描述】:
我正在尝试实现快速排序。看起来很简单,实现一个数据透视函数,以便将较小的元素和较大的元素聚集在两个单独的列表中。递归执行此操作,直到列表小到可以在恒定时间内排序。
def pivot(a, pivot_index):
# I guess you can keep two indexes one greater and one lesser and swap.
i, j = 0, len(a)-2
p = a[pivot_index]
a[pivot_index] = a[len(a)-1]
a[len(a)-1] = p
while(i<j):
if(a[i]<p):
i = i + 1
if(a[i]>p):
temp = a[i]
a[i] = a[j]
a[j] = temp
j = j - 1
#print(a)
return a[0:i], a[i:]
def quicksort(a):
if len(a) <= 1:
return a
p = len(a)//2
l1, l2 = pivot(a, p)
return quicksort(l1) + quicksort(l2)
if __name__ == "__main__":
a = [1,-9,288,91,3,4,58,67,8]
print(quicksort(a))
我得到错误:
Traceback (most recent call last):
File "11.py", line 79, in <module>
print(quicksort(a))
File "11.py", line 73, in quicksort
return quicksort(l1) + quicksort(l2)
File "11.py", line 73, in quicksort
return quicksort(l1) + quicksort(l2)
File "11.py", line 73, in quicksort
return quicksort(l1) + quicksort(l2)
[Previous line repeated 993 more times]
Traceback (most recent call last):
File "11.py", line 76, in <module>
print(quicksort(a))
File "11.py", line 70, in quicksort
return quicksort(l1) + quicksort(l2)
File "11.py", line 70, in quicksort
return quicksort(l1) + quicksort(l2)
File "11.py", line 70, in quicksort
return quicksort(l1) + quicksort(l2)
[Previous line repeated 993 more times]
File "11.py", line 69, in quicksort
l1, l2 = pivot(a, p)
File "11.py", line 54, in pivot
while(i<j):
RecursionError: maximum recursion depth exceeded in comparison
可能正在发生的事情是在快速排序中从未调用基本情况。但不知道如何解决。
【问题讨论】:
-
@cᴏʟᴅsᴘᴇᴇᴅ 不起作用,但为什么首先应该完成它?...pivot 需要遍历列表...
-
没关系,误读你的代码。
-
在每个函数的开头,打印参数,这样你就知道函数是如何被调用的。您肯定会看到重复,然后可以轻松找出它是如何发生的。
-
我建议花一点时间学习如何使用日志包,而不是使用 print 进行此类调试。但结构化演练(白板“测试”)对于这种算法分析仍然是一项有价值的技能。成为 CPU 并演练代码在做什么。
-
@JimDennis 嗯,日志包在这里有什么优势?对我来说似乎有点矫枉过正。
标签: python python-3.x algorithm sorting recursion