python-3.x - 这种快速排序算法的实现有什么问题?错误是 RecursionError
问题描述
def quicksort(array):
print(array)
n = 0
pivot = len(array) - 1
while n < pivot:
if array[pivot] > array[n]:
n+=1
elif array[pivot] <= array[n]:
array[n],array[pivot-1] = array[pivot-1], array[n]
array[pivot],array[pivot-1] = array[pivot-1], array[pivot]
pivot -= 1
if len(array[:pivot]) >1:
array[:pivot] = quicksort(array[:pivot])
if len(array[pivot+1:])> 1:
array[pivot+1:] = quicksort(array[pivot+1:])
return array
test = [21, 4, 1, 3, 9, 20, 25, 6, 21, 14]
print(quicksort(test))
引发以下错误:
Error: Traceback (most recent call last):
File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\idle.py", line 18, in <module>
print(quicksort(test))
File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\idle.py", line 14, in quicksort
array[pivot:] = quicksort(array[pivot:])
File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\idle.py", line 14, in quicksort
array[pivot:] = quicksort(array[pivot:])
File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\idle.py", line 12, in quicksort
array[:pivot] = quicksort(array[:pivot])
File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\idle.py", line 14, in quicksort
array[pivot:] = quicksort(array[pivot:])
File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\idle.py", line 14, in quicksort
array[pivot:] = quicksort(array[pivot:])
File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\idle.py", line 14, in quicksort
array[pivot:] = quicksort(array[pivot:])
[Previous line repeated 987 more times]
File "C:\Users\admin\AppData\Local\Programs\Python\Python37-32\idle.py", line 3, in quicksort
pivot = len(array) - 1
RecursionError: maximum recursion depth exceeded while calling a Python object
解决方案
def quicksort(array):
print(array)
n = 0
pivot = len(array) - 1
while n < pivot:
if array[pivot] > array[n]:
n+=1
elif array[pivot] <= array[n]:
array[n],array[pivot-1] = array[pivot-1], array[n]
array[pivot],array[pivot-1] = array[pivot-1], array[pivot]
pivot -= 1
if len(array[:pivot]) >1:
array[:pivot] = quicksort(array[:pivot])
if len(array[pivot:])> 1:
array[pivot:] = quicksort(array[pivot:])
return array
test = [19, 4, 1, 3, 9, 20, 25, 6, 21, 14]
print(quicksort(test))
M Oehm 是正确的!我尝试了这个修改后的代码,它适用于具有不同元素的数组。输出是:
[19, 4, 1, 3, 9, 20, 25, 6, 21, 14]
[6, 4, 1, 3, 9]
[6, 4, 1, 3]
[3, 4, 6]
[3, 4]
[14, 25, 20, 21, 19]
[19, 20, 21, 25]
[19, 20, 21]
[19, 20]
[1, 3, 4, 6, 9, 14, 19, 20, 21, 25]
- 如果您需要对具有重复元素的数组进行快速排序,则必须将其划分为 3 个(而不是 2 个)子数组
{{Xi}, {Xk}, {Xj}}
,其中{Xi}
小于枢轴{xk}=pivot
和{Xj} > pivot
。
推荐阅读
- c# - Simple.OData.Client 错误:类型上不存在属性“上下文”
- spring-boot - 类星体纤维在线程启动后返回空结果
- java - 来自守护程序的错误响应:在等待连接时取消请求(等待标头时超出 Client.Timeout)
- python - 尝试使用 python AWS CDK 创建空堆栈时返回 JSII 错误
- python - Python如何在系列系列上应用每列平均值
- python - 使用来自另一个 docker 容器的 python 包
- google-bigquery - PERCENTILE_CONT 和 BigQuery 分组
- reactjs - 如何使用打字稿根据某些条件添加图像链接并做出反应?
- angular - 如何解决使用 ngModel 的问题
- javascript - Vue:更新 Firestore 和 Firebase 云存储中的图像