Python 为什么这个快速排序没有正确排序?

Python Why is this quicksort not sorting properly?

在过去的三个星期里,我一直在尝试使用 python 实现快速排序功能,但我总是会遇到这种情况,而且大部分情况下它都会排序,但有一些项目不合适。

我认为我没有正确理解快速排序,所以如果您能从我的代码中看出原因,请解释一下。

我已选择枢轴作为列表中的第一个对象,"low",然后将其与列表的其余部分进行比较。如果列表索引 "low" 处的对象大于列表索引 "i" (在我的 for 循环中),那么我将 "i" 切换为 "E" (最初索引到项目 "low + 1"),如果确实切换,则 "E" 递增。即使不切换,"i" 也会递增(因为 for 循环)。

循环完成后,我递减 "E"(将其索引到列表中低于我的主元的最高数字),​​然后将其切换为 "low"(主元索引)

然后,我使用 "E" 对列表的左右两半进行快速排序,以确定列表的拆分位置。 - 这似乎是代码无法排序的地方。

我相信这就是快速排序的工作原理,但我没能让它工作。如果您知道我遗漏了什么,或者这只是我的台词之一,请告诉我。非常感谢任何对此问题的帮助。

(PS。"main" 函数只是将长度为 20 且变量值为 0-19 的列表传递到我的快速排序和 Python 内置排序中)

import random


def quick(A, low, high):
    if high <= low:
        return
    elif high > low:
        E = low+1
        for i in range(E, high):
            if A[low] > A[i]:
                A[i], A[E] = A[E], A[i]
                E +=1
        E -= 1
        A[low], A[E] = A[E], A[low]
        quick(A, low, E-1)
        quick(A, E+1, high)


def main():
    listA = []
    listB = []
    for i in range(20):
        int = random.randrange(0, 19)
        listA.append(int)
    for i in range(len(listA)):
        listB.append(listA[i])
    print("List A (before sort)" + str(listA))
    print("List B (before sort)" + str(listB))
    quick(listA, 0, len(listA)-1)
    print("\nList A (after sort)" + str(listA))
    print("List B (before sort)" + str(listB))
    listB.sort()
    print("\nList A (after sort)" + str(listA))
    print("List B (after sort)" + str(listB))


main()

你的问题是每次拆分都忽略了一个数字。 range(min, max) 给出的列表包括 min 但不包括 max,而是在 max-1

结束

quick(listA, 0, len(listA)-1)

应该是

quick(listA, 0, len(listA)),

quick(A, low, E-1)

应该是

quick(A, low, E).