返回
快速排序递归实现:三种方法解析及优化
后端
2023-12-26 09:32:54
快速排序,一种高效的排序算法,由计算机科学家 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)
优化策略
- 选择更好的基准值: 中位数或随机元素可以减少极端情况下的排序时间。
- 尾递归优化: 通过改变递归调用的顺序,可以优化尾递归。
- 插入排序优化: 当数组规模较小时,采用插入排序效率更高。
- 随机打乱: 在排序前随机打乱数组顺序,可以避免极端输入。
总结
快速排序是一个经典且高效的排序算法,其递归实现有多种方法。了解这些方法及其优化策略,将使您能够选择最适合您特定应用程序的实现。通过练习和理解,您将能够熟练地使用快速排序来解决各种排序问题。