概述
快速排序
与归并排序
一样也是基于分治算法的排序算法.所以它的实现方法也与其他的分治算法一样,需要进行分解子任务,处理子任务,归并子任务这些步骤.
但快速排序
与归并排序
不同,它是一种原地排序
算法(不需要额外的辅助数组),且快速排序
不使用中间值来分解任务,而是使用划分函数
.
算法过程
- 从数组中挑选出一个值,作为
基准值 k
.
- 重新排序序列,将所有小于
k
的值放到k
前面,所有大于k
的值放到k
后面(也可以理解为将数组a
切分为两个子数组a[begin...k-1],a[k+1...end]
,其中前一个子数组都小于k
,后一个子数组都大于k
).
- 递归地将两个子数组进行快速排序(递归到最底部时,子数组的大小是零或一,也就是已经排序好了.).
划分函数
划分函数
就是上述步骤中的第二步,它将数组根据基准值
进行重排序.根据基准值
选择的位置不同,划分函数
也有不同的实现方法,不过其根本思想都是将小于基准值
的值放到前面,大于基准值
的值放到后面.
使用末尾元素作为基准值
|
|
使用首元素作为基准值
|
|
代码实现
了解了划分函数
的实现,剩下就只需要递归地调用快速排序
不断地分解子任务即可.
注意,快速排序
与归并排序
不同,它不需要进行归并
(划分后就已经是有序的了),并且是先进行划分函数
,再分解任务.
|
|
本文作者为SylvanasSun(sylvanassun_xtz@163.com),转载请务必指明原文链接.