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

时间:2016-02-05 19:36:18

标签: python sorting quicksort

过去三周我一直在尝试使用python实现quicksort函数,但我总是到达这一点并且它主要进行排序,但是有一些项目不合适。

我认为我不能正确理解快速排序,所以如果你能从我的代码中找到原因请解释。

我选择了pivot作为列表中的第一个对象,“low”,然后将它与列表的其余部分进行比较。如果列表索引“low”的对象大于列表索引“i”(在我的for循环中),那么我将“i”切换为“E”(最初索引到项目“low + 1”),如果它开关,“E”递增。即使它没有切换,“i”也会递增(因为for循环)。

一旦我的循环结束,我减少“E”(将其索引到列表中低于我的数据的最高数字),​​然后将其切换为“低”(枢轴索引)

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

我相信这是快速排序的工作方式,但我无法让它发挥作用。如果你知道我错过了什么,或者它只是我的一条线,请告诉我。任何有关此问题的帮助将不胜感激。

(PS。“主要”功能只是将带有0-19值变量的20长度列表传递到我的快速排序和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()

1 个答案:

答案 0 :(得分:5)

您的问题是,您在每次拆分时都忽略了一个号码。 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)