![70a1aff8af4624b51b677a0abf9a25ae.png](https://img-blog.csdnimg.cn/img_convert/70a1aff8af4624b51b677a0abf9a25ae.png)
排序算法是最为常用的基础算法之一。排序是数值计算基础,本节将着重于高效的内排序算法。分治法作为排序中较为重要的思想,核心在于“分而治之,各个击破”。
一般情况下的思想是通过两两比较进行排序,实际产品环境中采用两两比较虽然理论上可以解决现实问题,但是实际上却不会采用两两比较的方式,因此本节中将会介绍性能较高的排序算法,也是实际中用得最多的方式。
一、快速排序
快速排序(Quick Sort)采用分治法的思想,把一个数值序列划分为两个子序列,然后对两个子序列再进行分治法的思想。计算过程如下:
- 从数值队列中选择一个基准元素。
- 将队列中的其它元素与基准元素比较,比基准元素小的元素放在基准元素的左边,比基准元素大的元素放在右边(降序排列则相反),则队列被基准元素划分为左右两个区间。
- 对两个区间的值,分别递归步骤2,使得最终形成有序的序列。
虽然上述步骤采用的是递归的方式,但是当区间小于等于1时,将会直接返回,因此不会无限制递归下去。例如对于队列数值“4 3 6 2 5”采用快速排序进行升序排列过程如下图所示。
![054fb9d08bcfc5b26497dcf2d4a6eb0e.png](https://img-blog.csdnimg.cn/img_convert/054fb9d08bcfc5b26497dcf2d4a6eb0e.png)
如上图所示,以数值“4”为基准,将比其小的元素“3”、“2”放置到左边,比其大的元素“6”、“5”放置到右边,形成以4为基准的左区间和右区间,然后对左区间和右区间分别再次选择出基准元素,重复上述过程,最终得到数值序列“2 3 4 5 6”。
- 时间复杂度。最坏的时间复杂度
,最优的时间复杂度
,平均时间复杂度
。
- 空间复杂度。快速排序的空间复杂度相对而言依然与具体的实现有关。
二、归并排序
归并排序(Merge Sort)是指将两个已经有序的序列合并成一个有序序列的排序方式。归并排序可以采用迭代的方式进行排序,例如有两组数值序列A、B,采用归并排序进行升序排序,则排序步骤如下所示:
- 申请存放最终合并后的数值序列存放空间,空间大小为数值序列A、B的空间之和。
- 初始化两个指针,分别指向数值序列A、B的首元素地址。
- 比较两个指针对应的值,将较小的值放入到最终存放空间,并移动较小值指针到序列的下一位。
- 重复上一个步骤,直到某一个指针已经指到序列的队尾,已经没有元素和另外一个序列进行比较。
- 将另外一个序列的剩余元素直接拷贝到最终序列存放空间的末尾。
采用的两组数值序列A、B,可以采用递归的思想