快速排序(quicksort)犯过的错误
我非常惭愧, 学计算机也好几年了, 居然现在还不会写快排, 可见我水平有多低下(而且现在我也就刚学会递归版, 不会迭代版).
而且我感觉这个非常容易写错. 所以我估计这篇文章我可能会不断更新.
import random
def quicksort(a,lo,hi):
if(lo==hi):
return
j=partition(a,lo,hi)
quicksort(a,lo,j-1)
quicksort(a,j+1,hi)
def partition(a,lo,hi):
pivot=a[lo]
i,j=lo+1,hi
while(True):
while(a[i]<=pivot):
if i==hi:
break
i+=1
while(a[j]>=pivot):
if j==lo+1:
break
j-=1
if(i>=j):
break
a[i],a[j]=a[j],a[i]
a[lo],a[j]=a[j],a[lo]
return j
a=[random.randint(0,10) for _ in range(10)]
quicksort(a,0,len(a)-1)
看这段代码有哪些bug?
事实上, 这么短的代码就有2个bug.
第一个:
if(lo==hi)
, 错了, 这个bug我用了快半个小时才找出来(可见我是多么菜..), 应该是lo>=hi. 为什么不能是lo==hi? 因为, 如果某一次递归中, j返回为0, 那么quicksort(a,lo,j-1)
中j就会为-1, 此时j-1<lo, 应该被发现并return- 下面partition的实现中,
if j==lo+1:
, 也是错的, 如果本来就是最小一个元素, j应该为lo, 但这样写, j根本不能取到lo.