You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中快速排序优化探究:为何效率不及插入排序?

快速排序优化问题

我了解到快速排序是最高效的排序算法之一,但我实现及测试的版本却表现缓慢。我已查阅过十年前的相关问答,但其答案均未做优化。我测试了多个答案的代码,发现都效率低下,于是自行实现了一个初步优化的版本:

import random
from collections import deque

def qsort(arr):
    if len(arr) <= 1:
        return arr
    else:
        return qsort([x for x in arr[1:] if x < arr[0]]) + [arr[0]] + qsort([x for x in arr[1:] if x >= arr[0]])

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    lt = deque()
    ge = deque()
    e0 = arr.popleft()
    for e in arr:
        if e < e0:
            lt.append(e)
        else:
            ge.append(e)
    return quick_sort(lt) + deque([e0]) + quick_sort(ge)

def quick_sort_helper(arr):
    return quick_sort(deque(arr))

order = list(range(256))
chaos = random.choices(range(666), k=256)

测试结果:

In [2]: %timeit qsort(chaos)
480 µs ± 2.83 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

In [3]: %timeit qsort(order)
4.05 ms ± 45.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [4]: %timeit quick_sort_helper(chaos)
394 µs ± 9.6 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

In [5]: %timeit quick_sort_helper(order)
3.06 ms ± 57.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

测试结果显示这些快速排序版本都极慢,我的优化仅带来小幅提升。作为对比,我快速实现的插入排序版本性能反而更优:

def bisect_right(a, x):
    lo, hi = 0, len(a)
    while lo < hi:
        mid = (lo + hi) // 2
        if x < a[mid]:
            hi = mid
        else:
            lo = mid + 1
    return lo

def insertion_sort(arr):
    out = deque()
    for e in arr:
        out.insert(bisect_right(out, e), e)
    return out

测试结果:

In [12]: %timeit insertion_sort(chaos)
311 µs ± 6.28 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

In [13]: %timeit insertion_sort(order)
267 µs ± 7.93 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

此外,我测试了评论中链接的另一答案代码,其性能也未超过我的版本,仅在最坏情况表现稍好:

In [22]: %timeit qsort(chaos, 0, 255)
391 µs ± 6.95 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
In [28]: %timeit qsort(order, 0, 255)
360 µs ± 6.43 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)

请问如何通过减少递归、识别有序子序列来优化快速排序算法,消除不必要的计算?


内容的提问来源于stack exchange,提问作者Ξένη Γήινος

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 06:47:34