zoukankan      html  css  js  c++  java
  • 快速排序(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.
  • 相关阅读:
    SVN 常用keywords 记录
    HTML5新特性介绍
    php文件上传错误代码
    MySQL的 Grant命令权限分配
    前端开发工具整理
    Java多线程编程经验谈
    一套密码强度判断方案
    傲游浏览器下Flash和Js交互问题
    在xml中使用&和字符
    ibatis和myibatis
  • 原文地址:https://www.cnblogs.com/Tokubara/p/14861652.html
Copyright © 2011-2022 走看看