快速排序
快排快排,显然重在快字,但是如何实现这个快呢?
简述
快排是一种采用分治策略的划分交换排序,由此我们就能看见这个快字的奥秘:划分 + 交换 + 分治。
实现划分交换以及分治的操作就构成了快排的基本步骤:
- 要实现划分首先需要有一个标准
先从待排序数列中取出一个数作为基准
- 通过数字交换实现区间的划分
比基准数大的均放在其右边,比基准数小的均放在其左边
- 得到左右区间之后进行分治
对左右区间进行1,2操作直到个区间只有一个数
例证
详细的实现过程,我们通过一个例子来说明
假设我们现有一个数组 a[6] = {10,20,5,3,14,16}
0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
10 | 20 | 5 | 3 | 14 | 16 |
我们设置 i=0 ,j=5 来标志数组的初始左右边界
取第一个数 X = a[0] = 10 作为基准数
0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
10 | 20 | 5 | 3 | 14 | 16 |
i = 0 | j=5 |
(1) 从右往左即从j向前寻找比第一个基准数小的数 *j–*可知是 a[3] = 3 因为比基准数小的数字要放在基准数的左侧,所以将 a[3]和a[i] 数字交换
得到结果如下
0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
3 | 20 | 5 | 10 | 14 | 16 |
i = 0 | j = 3 |
(2) 从左往右即从 i向后寻找第一个比基准数大的数 *i++*可知是 a[1]=20因为比基准数小的数字要放在基准数的右侧,所以将 *a[1]和a[j]*数字交换
得到结果如下
0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
3 | 10 | 5 | 20 | 14 | 16 |
i = 1 | j = 3 |
重复(1),(2)步,直到 i==j最终得到结果如下
0 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
3 | 5 | 10 | 20 | 14 | 16 |
i == j = 2 |
由此完成一次排序,基准数 X = 10 左侧的数均小,右侧的数均大,由分治法再对左右区间重复操作,最终完成排序
完整的过程可以参考下图(来源百度)