python - 使用就地排序的 QuickSort

标签 python python-3.x quicksort

我正在尝试使用就地排序在 python 中编写快速排序代码。我的代码在子数组中运行完美,但是它似乎无法将子数组粘在一起以形成最终的排序数组。

def quickSort (ar):

    if len(ar)>1:
        pivot = ar[-1]
        wall = 0
        for i in range(len(ar)-2):
            if ar[i] <= pivot:
                ar[wall], ar[i] = ar[i], ar[wall]
                wall += 1
        ar[wall], ar[-1] = ar[-1], ar[wall]
        quickSort (ar[:wall])
        quickSort (ar[wall+1:])

最佳答案

您的代码尝试就地排序,但随后它将切片副本传递给递归调用,因此您只需就地对这些副本进行排序,然后丢弃它们。

(如果不清楚:对列表进行切片总是复制列表。更复杂的类型 - 例如 memoryviewnp.array - 可能支持对其部分结构的“共享 View ”,但列表故意简单。)

<小时/>

解决此问题的一种方法是更改​​为复制而不是就地排序,其结尾为:

return quickSort(ar[:wall]) + ar[wall] + quickSort(ar[wall+1:])

(当然,您还需要更改上面的简单代码以构建副本而不是就地洗牌。)

<小时/>

另一种方法是通过传递列表本身和切片索引来继续就地执行此操作,而不是列表的切片副本:

def quickSort(ar, start=None, stop=None):
    if start is None: start = 0
    if stop is None: stop = len(ar)

    pivot = ar[stop-1]
    for i in range(start, (stop-start)-2):

    # and so on

    quickSort(ar, start, wall)
    quickSort(ar, wall+1, stop)
<小时/>

只要确保您选择其中一个即可 - 一种部分就地、部分复制和组装的类型是一团糟。

关于python - 使用就地排序的 QuickSort,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50084073/

相关文章:

python - 如何使用相对路径从包内的模块内部打开文件?

c++ - 计算排序算法中的执行时间

python - 循环遍历 JSON 文件的文件夹以从 Python 中的每个文件中提取相同的关键字

python - 如何使用 Python 中的 API 从 csv 文件读取数据

java - 双向链表上的快速排序

sorting - 快速排序 - 使其稳定的条件

python - 化学信息API?

python - 如何在 Python 中使用 os.execve

python - 为 Callable 类型提示指定 *args

python-3.x - 在 PyCharm 中使用黑色格式化程序的问题