【发布时间】:2021-10-02 01:10:02
【问题描述】:
我试图在不使用递归的情况下在 Python 中实现快速排序,但到目前为止我发现的所有参考实现或伪代码都使用递归。
这样做的原因是我将调整这个非递归实现以在使用 Numba 的 GPU 上运行,而我不能在那里进行递归调用。
是否有不使用递归的一维数组(例如,Numpy 数组或 Python 列表)的快速排序实现?
谢谢,
爱德华多
【问题讨论】:
-
从本质上讲,递归只不过是一种管理堆栈的便捷方式。任何可以通过递归实现的东西也可以通过显式管理的堆栈以非递归方式实现。在 Python 中,您可以使用列表作为堆栈。代码通常不那么清晰,但也不需要那么糟糕。每当您进行递归调用时,将恢复当前调用所需的状态推送到堆栈上。每当您要递归返回时,从堆栈中弹出并恢复该状态。
-
将标准递归快速排序转换为使用堆栈管理其状态的快速排序应该是一个相当简单的练习。您需要保存下限和上限以及枢轴索引。然后你可以循环而不是递归。将边界设置为第一个分区、循环并恢复您的上下文。然后将边界设置为第二个分区、循环并恢复您的上下文。这就是您需要做的所有事情。
-
另一种可能性是使用堆排序,它不需要递归或堆栈。它也是一个 O(n*log(n)) 排序算法。它的平均情况性能比快速排序稍差,但它的最坏情况性能仍然是 O(n*log(n)),不像快速排序在最坏情况下可能比 O(n*log(n)) 更差。
标签: python numpy sorting quicksort