首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python为什么这个快速排序不能正确排序?

Python为什么这个快速排序不能正确排序?
EN

Stack Overflow用户
提问于 2016-02-05 19:36:18
回答 1查看 116关注 0票数 0

在过去的三周里,我一直在尝试使用python实现快速排序函数,但是我总是达到这个目的,它主要是排序,但是有一些不合适的地方。

我不认为我正确地理解了快速排序,所以如果您可以从我的代码中看出原因,请解释。

我选择了支点作为列表中的第一个对象,"low",然后将其与列表的其余部分进行比较。如果列表索引"low“处的对象大于列表索引"i”(在for循环中),则使用"E“(最初索引为"low + 1")切换"i”,如果它确实切换,则"E“递增。即使不切换,"i“也会增加(因为for循环)。

循环完成后,我会减少"E“(将其索引到列表中比枢轴低的最高数字),然后用”低“(枢轴索引)切换它。

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

我相信这是快速排序的工作方式,但我一直无法使它工作。如果你知道我错过了什么,或者这只是我的台词之一,请告诉我。如果能在这个问题上提供任何帮助,我们将不胜感激。

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

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-05 19:49:20

你的问题是你忽略了每一个分裂的一个数字。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)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35232133

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档