我正在尝试实施this video和this document中讨论的算法。
我的快速排序代码,取决于选择数组中的中间元素作为支点(见下文),而不是上面文档的作者使用数组中的第一个元素作为shown here in the video的轴。
显然,我的代码不起作用(最终用完递归限制)。我想知道是不是因为我的代码中出现了一些愚蠢的错误,或者只要我从中间选择枢轴就不行。
def partition(a, start, end):
# I pick the pivot as the middle item in the array
# but the algorithm shown in the video seems to
# pick the first element in the array as pivot
piv = (start + end) // 2
pivotVal = a[piv]
left = start
right = end
while left <= right:
while a[left] < pivotVal:
left += 1
while a[right] > pivotVal:
right -= 1
if left <= right:
temp = a[left]
a[left] = a[right]
a[right] = temp
left += 1
right -= 1
return left
def quicksort(a, start, end, k):
if start < end:
piv = partition(a, start, end)
if piv == (k - 1):
print("Found kth smallest: " + piv)
return a[piv]
elif piv > (k - 1):
return quicksort(a, start, piv, k)
else:
return quicksort(a, piv + 1, end, k)
myList = [54, 26, 93, 17, 77, 31, 44, 55, 20]
quicksort(myList, 0, len(myList) - 1, 3)
print(myList)
答案 0 :(得分:0)
如果您正在使用包含数组边界,这不是最方便的技巧,则必须将递归调用的范围更改为[start, piv - 1]
和[piv + 1, end]
原因是,您正在重新考虑每个递归到数组左侧的piv元素。
包含所述更改的代码在没有任何堆栈溢出错误的情况下运行。
编辑输出不适合k的少数值。您可能需要再次检查分区逻辑。