我有2个函数,一个对数组进行分区并快速排序的函数:
def partition(a, i, j):
h = i+1
for k in range(i+1, j):
if a[k] < a[i]:
a[h],a[k] = a[k],a[h]
h += 1
a[i],a[h-1] = a[h-1],a[i]
return h
# a is an array. After function call a[i..j-1] is sorted in increasing order
def quicksort(a, i, j):
if j-i <= 1: return
swap(a, i, j)
p = partition(a, i, j)
quicksort(a, i, p)
quicksort(a, p, j)
这适用于我尝试的所有测试用例,即我调用快速排序(a,0, len(a))并在列表a之后排序。
我正在尝试更改pivot元素。我想使用数组的最后一个元素而不是第一个元素作为pivot(就像在上面的实现中一样)。为此,我将以下代码行添加到分区前的快速排序函数中:
a[i],a[j-1] = a[j-1],a[i]
一切都坏了。超过了最大递归深度。我不明白为什么会发生这种情况,这让我发疯。
给定输入[1,2,3]
,它会以一致的p
进入无限循环;用p-1
/p 1
切换p 1
:
def quicksort(a, i, j):
if j <= i: return
swap(a, i, j)
p = partition(a, i, j)
quicksort(a, i, p-1)
quicksort(a, p+1, j)