我正在尝试快速排序。看起来很简单,实现一个pivot函数,以便将较小的元素和较大的元素收集在两个单独的列表中。以递归方式执行此操作,直到列表足够小以便在恒定时间内进行排序。
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
可能发生的事情是,基本情况永远不会在快速排序中被调用。但不知道如何解决它。
以下功能通过将输入数据作为数组发送到快速排序功能来说明如何实现快速排序。这里我们使用递归实现了快速排序,如下所示:
- 首先检查数组是否包含多于1个元素。如果数组中的元素少于或等于一个元素,则返回数组。(如果len(arr)<= 1则返回arr)
- 现在从数组的中间取一个pivot元素(从数组大小的一半检索元素),然后在第一次迭代中计算pivot元素(pivot = arr [len(arr)// 2])
- 如果数组中的元素小于pivot元素,则使用python中的list comprehension创建一个左数组(left = [x for ar in if x <pivot]中的x)
- 如果数组中的元素等于pivot元素,则创建一个中间数组(中间= [x代表x中的x,如果x == pivot])
- 如果数组中的元素超过pivot元素,则创建一个右数组(right = [x for x in arr if x> pivot])
- 将左数组,右数组发送到quicksort函数并递归重复它们,直到对数组中的所有元素进行排序。
def quicksort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr)//2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quicksort(left) + middle + quicksort(right)