排序算法系列文章
排序(一):冒泡排序
排序(二):选择排序
排序(三):堆排序
排序(四):插入排序
排序(五):二分搜索
排序(六):归并排序
排序(七):快速排序
排序(八):希尔排序
快速排序(Quick Sort)
基本思想
- 快速排序(Quick Sort)是对冒泡排序的一种改进,采用的是分治策略(一般与递归结合使用),以减少排序过程中的比较次数。
- 快速排序的本质:逐渐将每一个元素都转换成轴点元素。
算法步骤
- 数组中选择一个轴点元素(pivot), 假设每次都选择 索引为0的元素为轴点元素。
- 利用pivot将数组分割成2个子数组,将小于pivot的元素放在pivot前面(左侧),将大于pivot的元素放在pivot后面(右侧),等于pivot的元素放哪边都可以。
- 递归对子序列进行前面两步操作,直到不能再分割(子序列中只剩下1个元素)。
轴点构造
- 最终目标是构造出以轴点元素为中心的序列:
- 左半边是小于轴点元素的序列;
- 右半边是大于轴点元素的序列;
过程:
begin为序列首位置,首先备份一个轴点元素
- 从右往左扫描,如果寻找到比轴点元素小的元素,找到以后,放到 begin 位置,begin++,然后反向寻找;否则则是end–;
- 从左往右扫描,如果寻找比轴点元素大的元素,找到以后,放到 end 位置,end–,然后反向寻找;否则则是 begin++;
- 当 begin == end,说明扫描结束,将一开始备份的轴点元素放到中间。
- 不断循环这个过程,直到把所有比轴点元素小的元素放到左半部分,把所有比轴点元素大的元素放到右半部分,才算完成这个轴点的构造。
轴点构造–优化
- 在轴点左右元素数量比较均匀的情况下,同时也是最好情况:O(nlogn)
- 如果轴点左右元素数量极度不均匀,最坏情况:O(n^2)
- 为了降低最坏情况的出现概率,一般采取的做法是:
随机选择轴点元素
,即可以在备份轴点元素前,将 begin 位置的元素