快速排序
本文最后更新于:2024年3月18日 凌晨
快速排序
算法分析
- 快速排序算法是基于分治策略的另一个排序算法,其基本思想是,对于输入的子数组
a[l:r]
,按以下三个步骤进行排序。- 分解(Divide):以
a[r]
为基准元素将a[l:r]
划分成3段a[l:q-1]
,a[q]
和a[q+1:r]
,使a[l:q-1]
中任何一个元素小于等于a[q]
,而a[q+1]:r]
中任何一个元素大于等于a[q]
,下标q在划分过程中确定。 - 递归求解(Conquer):通过递归调用快速排序算法分别对
a[l:q-1]
和a[q+1:r]
进行排序。 - 合并(Merge):由于对
a[l:q-1]
和a[q+1:r]
的排序是就地进行的,所以在a[l:q-1]
和a[q+1:r]
都已排好的序后,不需要执行任何计算,a[l:r]
就已排好序。
- 分解(Divide):以
代码实现
流程图
1 |
|
quickSort(int[] nums,int l,int r)
:对数组a[l:r]
进行排序。int Partition(int[] nums, int l, int r)
:对数组nums[l:r]
,划分后返回一个数组元素下标q
,使得该数组元素在本数组部分中属于数值大小中位,即小于nums[q]
的元素在nums[q]
的左边,大于nums[q]
的元素在nums[q]
的右边。
算法改进
- 容易看到,快速排序算法的性能取决于划分的对称性,通过修改函数Partition可以设计出采用随机选择策略的快速排序算法。
- 在快速排序算法的每一步中,当数组还没有被划分时,可以在
a[l:r]
中随机选出一个元素作为划分基准,这样可以使划分基准的选择是随机的,从而可以期望划分是较对称的。
1 |
|
RandomizedPartition(int[] nums, int l, int r)
:与Partition(int[] nums, int l, int r)
类似,但是会使用随机数使划分基准的选择是随机的。
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!