def partition(lst, low,high, pivot,col):
lst[high],lst[pivot] = lst[pivot],lst[high]
pivot = high
i = low
while i +1 <pivot:
if lst[i][col] > lst[pivot][col]:
lst[pivot], lst[pivot-1] = lst[pivot-1], lst[pivot]
lst[i],lst[pivot] = lst[pivot],lst[i]
pivot -= 1
else:
i +=1
if lst[i][col] > lst[pivot][col]:
lst[i],lst[pivot] = lst[pivot],lst[i]
pivot -= 1
return pivot
def quick(lst,low,high,col,ascending):
if low >= high:
return
else:
#print(low,high)
pivot = random.randint(low,high)
#print(pivot)
part_point = partition(lst,low,high,pivot,col)
print(part_point,high)
quick(lst,low,part_point-1,col,ascending)
quick(lst,part_point+1, high,col, ascending)
我正在使用Python学习算法,这是我对quicksort的实现。虽然它在某些情况下运行良好,但在大多数情况下它超过了递归深度。我认为我的执行中有一些错误,我错过了。
答案 0 :(得分:0)
我不习惯在分区方法中看到枢轴更改。通常将数据透视表设置为数组中的左元素。它可以任选地用随机元素a [k]切换,其中低<= k <=高。通常,分区方法使用两个变量i和j,其中i是计数器,因为分区从左到右穿过数组,j表示最大元素a [j],使得a [j] <= pivot。 a [j]处的值在分区函数结束时与[low]交换,函数返回j。
Sedgewick和Wayne在他们的网站上有关于这个主题的奇妙章节:https://algs4.cs.princeton.edu/23quicksort/