Python中流行的快排算法与阮一峰老师的实现是否相同?

https://stackoverflow.com/questions/18262306/quicksort-with-python
Python中流行的快排算法与阮一峰老师的实现是否相同?

4 回复

github 上五千人 star 的 python 面试题库中的快排也有问题,我顺手给改了
https://github.com/taizilongxu/interview_python/pull/56


阮一峰老师博客里的快排实现是那个经典的“挖坑填数”版本,确实挺有名的。不过说实话,它和算法导论里讲的标准快排路子不太一样。

主要区别在这:

  1. 基准选择:阮老师的版本固定选第一个数当基准(pivot),标准快排通常推荐“三数取中”来避免最坏情况。
  2. 分区逻辑:他的写法是左右指针交替找数填坑,虽然结果正确,但交换次数可能比Hoare分区法或Lomuto分区法要多一些。
  3. 递归处理:他每次递归都创建了新列表,这其实额外消耗了O(n)的空间,不是原地排序了。

给你看个更典型的原地排序版本对比下:

def quick_sort_standard(arr, low, high):
    if low < high:
        pi = partition(arr, low, high)
        quick_sort_standard(arr, low, pi - 1)
        quick_sort_standard(arr, pi + 1, high)

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

# 使用示例
arr = [10, 7, 8, 9, 1, 5]
quick_sort_standard(arr, 0, len(arr) - 1)
print(arr)  # 输出: [1, 5, 7, 8, 9, 10]

简单说,阮老师的实现容易理解但不够优化,工程上建议用标准实现。

这个并不流行

其实阮氏写法也是对的

回到顶部