You need to enable JavaScript to run this app. Python是否存在无需递归的快速排序实现?
优惠活动
大模型
产品
解决方案
定价
更多

Python是否存在无需递归的快速排序实现?

非递归快速排序Python实现(适配Numba GPU场景)

本实现采用栈替代递归调用栈,完全无递归逻辑,支持原地排序一维Python列表/Numpy数组,可直接适配Numba GPU编译要求。

核心逻辑

  • 用栈存储待排序子数组的左右边界索引,替代递归的系统栈
  • 每次弹出一组边界,完成分区操作后,将生成的两个未排序子数组边界压入栈
  • 重复上述操作直到栈为空,全数组排序完成
  • 全程原地修改数组,无额外大内存申请,适合GPU显存受限场景

可直接适配Numba的实现代码

Lomuto分区逻辑实现简单,无额外复杂操作,更适合Numba GPU编译优化:

def partition(arr, low, high):
    # 取最右侧元素为基准值
    pivot = arr[high]
    i = low - 1
    for j in range(low, high):
        if arr[j] <= pivot:
            i += 1
            arr[i], arr[j] = arr[j], arr[i]
    arr[i + 1], arr[high] = arr[high], arr[i + 1]
    return i + 1

def quicksort_iterative(arr):
    # 兼容Python列表、Numpy数组输入
    n = len(arr)
    # 初始化栈,存储子数组的左右边界索引
    stack = []
    # 初始压入全数组的边界
    stack.append((0, n - 1))
    
    # 栈非空则循环处理
    while stack:
        low, high = stack.pop()
        # 分区得到基准值的位置
        pi = partition(arr, low, high)
        # 左子数组有未排序元素则压入栈
        if pi - 1 > low:
            stack.append((low, pi - 1))
        # 右子数组有未排序元素则压入栈
        if pi + 1 < high:
            stack.append((pi + 1, high))
    return arr

Numba GPU适配优化建议

如果需要放到Numba CUDA环境运行,可做如下修改:

  • 给两个函数添加@numba.njit装饰器即可在CPU侧加速,添加@numba.cuda.jit可适配GPU kernel逻辑
  • GPU环境下建议预先固定栈的最大长度(一般设为数组长度的2倍即可覆盖所有场景),避免列表动态扩容的编译问题
  • 分区逻辑可根据GPU线程布局调整基准值选择策略,进一步提升并行效率

测试示例

import numpy as np
# 测试Numpy数组
arr_np = np.array([10, 7, 8, 9, 1, 5])
quicksort_iterative(arr_np)
print(arr_np) # 输出 [ 1  5  7  8  9 10]

# 测试Python列表
arr_list = [10, 7, 8, 9, 1, 5]
quicksort_iterative(arr_list)
print(arr_list) # 输出 [1, 5, 7, 8, 9, 10]

内容的提问来源于stack exchange,提问作者Edy Bourne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 12:21:02