CS61B 课程笔记(Lecture 34 More Quick Sort, Stability, Shuffling)
CS61B 课程笔记(Lecture 34 More Quick Sort, Stability, Shuffling)
1. 快速排序的基本概念
- 定义:快速排序是一种分治法的排序算法,基于选择一个“枢轴”元素,并将数组分为两部分,左侧小于等于枢轴,右侧大于枢轴。
- 基本步骤:
- 选择枢轴(通常选择最左边的元素)。
- 划分数组,使得左侧元素均小于或等于枢轴,右侧元素均大于枢轴。
- 递归地对左、右子数组进行快速排序。
2. 快速排序的性能分析
- 最优情况:当每次划分均匀,时间复杂度为 (\(\Theta(N \log N)\))。
- 最坏情况:当数组已排序或全为重复元素时,时间复杂度为 (\(\Theta(N^2)\))。
- 影响因素:
- 枢轴选择的质量
- 输入数组的特性
3. 避免最坏情况的策略
3.1 引入随机性
- 随机选择枢轴:随机选择一个元素作为枢轴,降低最坏情况发生的概率。
- 数组洗牌:在排序前随机打乱数组,以避免已排序或重复元素的影响。
3.2 智能枢轴选择
- 常数时间的选择:选择几个元素,选出“最佳”作为枢轴。
- 线性时间的选择:使用“精确中位数快速排序”算法,找到中位数作为枢轴,确保每次划分的有效性。
3.3 自省算法
- 在递归深度达到某个阈值时,切换到其他排序算法(如归并排序)。
4. 快速排序的变种
4.1 快速排序 L3S
- 特性:选择最左边的枢轴,洗牌数组。
- 性能:比归并排序略差。
4.2 快速排序 LTHS
- 特性:采用Tony Hoare的就地划分方案。
- 性能:可以获得更好的快速排序效果。
4.3 精确中位数快速排序
- 使用“快速选择”算法在线性时间内识别中位数。
- 性能:在最坏情况下为 (\(\Theta(N^2)\)),但预期运行时间为 (\(\Theta(N)\))。
5. 快速选择算法
- 目标:通过划分找到中位数。
- 过程:
- 初始化数组,选择最左边的项为枢轴。
- 划分数组,找到中位数的索引。
- 根据中位数的位置决定继续划分的方向。
6. 总结
- 快速排序:
- 有多种变种可供选择。
- 随机化与智能枢轴选择是改善性能的关键。
- 快速选择:
- 预期运行时间为 (\(\Theta(N)\)),但最坏情况为 (\(\Theta(N^2)\))。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Totoroの旅!
评论