返回

快速排序递归实现:三种方法解析及优化

后端

快速排序,一种高效的排序算法,由计算机科学家 Hoare 于 1962 年提出。它的基本原理是,选取一个基准值,将数据序列划分为小于和大于基准值的两个子序列,然后分别递归地对这两个子序列进行排序。

三种递归实现方法

1. Hoare 分区

def quick_sort_hoare(arr, low, high):
    """快速排序(Hoare 分区)"""
    if 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]
        quick_sort_hoare(arr, low, i)
        quick_sort_hoare(arr, i + 2, high)

2. Lomuto 分区

def quick_sort_lomuto(arr, low, high):
    """快速排序(Lomuto 分区)"""
    if 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]
        quick_sort_lomuto(arr, low, i)
        quick_sort_lomuto(arr, i + 2, high)

3. 三向切分

def quick_sort_three_way(arr, low, high):
    """快速排序(三向切分)"""
    if low < high:
        pivot = arr[high]  # 选择最后一个元素作为基准值
        lt = low  # 小于基准值的元素索引
        gt = high  # 大于基准值的元素索引
        i = low
        while i <= gt:
            if arr[i] < pivot:
                arr[i], arr[lt] = arr[lt], arr[i]
                lt += 1
                i += 1
            elif arr[i] > pivot:
                arr[i], arr[gt] = arr[gt], arr[i]
                gt -= 1
            else:
                i += 1
        quick_sort_three_way(arr, low, lt - 1)
        quick_sort_three_way(arr, gt + 1, high)

优化策略

  • 选择更好的基准值: 中位数或随机元素可以减少极端情况下的排序时间。
  • 尾递归优化: 通过改变递归调用的顺序,可以优化尾递归。
  • 插入排序优化: 当数组规模较小时,采用插入排序效率更高。
  • 随机打乱: 在排序前随机打乱数组顺序,可以避免极端输入。

总结

快速排序是一个经典且高效的排序算法,其递归实现有多种方法。了解这些方法及其优化策略,将使您能够选择最适合您特定应用程序的实现。通过练习和理解,您将能够熟练地使用快速排序来解决各种排序问题。