【问题标题】:QuickSort in Python. Increment in array troublePython 中的快速排序。数组问题的增加
【发布时间】:2018-02-20 20:44:48
【问题描述】:

我正在尝试在 python 中实现快速排序。问题是如何在数组a 中增加/减少 i/j 的值。我知道我应该写 i=i+1 并且在 python 中没有像 i++ 这样的东西,但我不明白我应该以哪种方式这样做。 我是新手,这是我的代码。

def quicksort(a,lo,hi):
    if(hi<=lo):
        return
    i = lo - 1
    j = hi
    v = a[hi]

    while True:
        while(a[++i] < v):
            pass

        while(v < a[--j]):
            if(j==lo):
                break
        if(i>=j):
            break
        t = a[i]
        a[i] = a[j]
        a[j] = t

    t = a[i]
    a[i] = a[hi]
    a[hi] = t
    quicksort(a, lo, i - 1)
    quicksort(a, i + 1, hi)

【问题讨论】:

    标签: python increment quicksort


    【解决方案1】:

    以下结构在 Python 中的工作方式与在 C++ 中的工作方式不同:

    while(a[++i] &lt; v):

    还有这个:

    while(v &lt; a[--j]):

    修改代码的方式如下:

    def quicksort(a,lo,hi):
        if(hi<=lo):
            return
        i = lo - 1
        j = hi
        v = a[hi]
    
        while True:
            i += 1
            while(a[i] < v):
                i += 1
                pass
    
            j -= 1
            while(v < a[j]):
                j -= 1
                if(j==lo):
                    break
            if(i>=j):
                break
            t = a[i]
            a[i] = a[j]
            a[j] = t
    
        t = a[i]
        a[i] = a[hi]
        a[hi] = t
        quicksort(a, lo, i - 1)
        quicksort(a, i + 1, hi)
    

    【讨论】:

    • 非法?你试过让它运行/编译吗?顺便说一句,您的代码不等同于 OP 想要的。
    • 编译?我们在谈论 Python 吗?
    【解决方案2】:

    在 python 中,你不能分配和获取值,这是一个故意的限制,以避免拼写错误,找到正确的序列点...

    您别无选择,只能“模拟” C 移植代码:

        while(a[++i] < v):
            pass
    
        while(v < a[--j]):
            if(j==lo):
                break
    

    (请注意,这两种构造都会生成一个无限循环,因为:

    ++i == i
    

    --j == j
    

    (应用一元加任意次数或一元减偶数得到相同的数字,请参阅Why Don't Two Plus Operators Throw an Error (e.g., 1 + + 2)

    所以改成:

        i += 1
        while(a[i] < v):
            i += 1
    
        j -= 1
        while(v < a[j]):
            if(j==lo):
                break
            j -= 1
    

    【讨论】:

    • 谢谢,感谢您的帮助。
    猜你喜欢
    • 2018-01-31
    • 2019-06-01
    • 2020-06-18
    • 2018-12-01
    • 2018-05-27
    • 2022-10-31
    • 2017-01-14
    • 1970-01-01
    • 2016-10-02
    相关资源
    最近更新 更多