我试图在python中使用Hoare分区实现快速排序,代码来自https://stackoverflow.com/a/41211360/301513
但是当我把pivot = a_list[low]
改成pivot = a_list[high]
的时候,我就是不能让它工作
有人能帮忙吗
def quicksort(a_list):
"""Hoare partition scheme, see https://en.wikipedia.org/wiki/Quicksort"""
def _quicksort(a_list, low, high):
# must run partition on sections with 2 elements or more
if low < high:
p = partition(a_list, low, high)
_quicksort(a_list, low, p)
_quicksort(a_list, p+1, high)
def partition(a_list, low, high):
pivot = a_list[low] # changing to pivot = a_list[high] breaks the program
while True:
while a_list[low] < pivot:
low += 1
while a_list[high] > pivot:
high -= 1
if low >= high:
return high
a_list[low], a_list[high] = a_list[high], a_list[low]
low += 1
high -= 1
_quicksort(a_list, 0, len(a_list)-1)
return a_list
----更新----
为了确保我真正理解快速排序,我还尝试了使用pivot = array[low]
进行lomuto分区。这是另一个挑战,所以请检查@rcgldr更新的答案
这似乎足以作出纠正:
将名称更改为a[],lo,hi,p(枢轴)
对于问题中的代码,pivot可以是除[hi]之外的任何元素。对于具有PIVOT=A[H]的问题的一个例子,考虑LO=0,HI=1,和A〔0〕& lt的情况;a[1]
切换到返回lo,p-1,p,允许枢轴为除[lo]之外的任何元件:
在单个功能中,旋转轴=a[lo]的Lomuto。在分区步骤之后,它只在较小的分区上重复,然后更新lo或hi并循环回处理较大的分区。这将堆栈空间复杂度限制为O(log(n)),但最坏情况下的时间复杂度仍然是O(n^2)
相关问题 更多 >
编程相关推荐