快速排序(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.
第一个:

  1. if(lo==hi), 错了, 这个bug我用了快半个小时才找出来(可见我是多么菜..), 应该是lo>=hi. 为什么不能是lo==hi? 因为, 如果某一次递归中, j返回为0, 那么quicksort(a,lo,j-1)中j就会为-1, 此时j-1<lo, 应该被发现并return
  2. 下面partition的实现中, if j==lo+1:, 也是错的, 如果本来就是最小一个元素, j应该为lo, 但这样写, j根本不能取到lo.
posted @ 2021-06-08 10:12  Tokubara  阅读(157)  评论(0编辑  收藏  举报