2023-05-01 22:20:19
快速排序(快排)是一种基于分治思想的高效排序算法,通过递归地将数组划分为较小和较大的子数组实现排序,平均时间复杂度为 O(nlogn),适用于大规模数据排序。
1. 什么是快速排序
左边部分的所有元素小于分界值。
右边部分的所有元素大于或等于分界值。
选择分界值(通常为数组首元素)。
遍历数组,将小于分界值的元素移到左侧,大于或等于的移到右侧。
固定分界值的位置,递归处理左右子数组。


QuickSort:递归调用,处理左右子数组。
partition:一趟排序,确定分界值位置并划分数组。
QuickSort 检查递归终止条件(left >= right)。
partition 选择分界值(nums[left]),并通过遍历数组完成划分。
交换元素确保左侧小于分界值,右侧大于或等于分界值。
返回分界值下标,供递归调用使用。

时间复杂度:
理想情况:每次划分将数组平分,递归深度为 logn,每趟排序时间为 O(n),总时间为 O(nlogn)。
最坏情况:每次划分选到最小或最大元素(如数组已有序),递归深度为 n,总时间为 O(n2)。
平均情况:通过随机化分界值或“三者取中”策略,可避免最坏情况,保持 O(nlogn)。
空间复杂度:
递归调用栈的空间消耗为 O(logn)(理想情况)或 O(n)(最坏情况)。
优化策略:
三者取中:从 nums[left]、nums[right] 和 nums[(left+right)/2] 中选中间值作为分界值。
随机化分界值:随机选择一个元素作为分界值,降低最坏情况概率。
稳定性:快速排序是不稳定的排序算法(相同元素的相对位置可能改变)。
适用场景:
大规模数据排序(如内存中的数组)。
对平均性能要求较高,且可接受最坏情况风险的场景。
总结:快速排序通过分治思想和递归实现高效排序,平均时间复杂度为 O(nlogn),但需注意最坏情况的优化。其简洁性和高效性使其成为内部排序的首选方法之一。