数据结构与算法(十四)——快排、归并排序
快排、归并排序都使用到了分治思想。
分治,顾名思义,就是分而治之,将一个大问题分解成小的子问题 来解决。小的子问题解决了,大问题也就解决了。
分治思想跟递归思想很像,一般用递归来实现的。
分治是一种解决问题的处理思想,递归是一种编程技巧。
快排排序(Quick Sort)
快排排序算法的操作如下:
- 挑选基准值:从数列中挑出一个元素,称为“基准”(pivot);
- 分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成;
- 递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。
1 | public class Application { |
优化
- 三数取中法
我们从区间的首、尾、中间,分别取出一个数,然后对比大小,取这 3 个数的中间值作为分区点。 - 随机法
随机法就是每次从要排序的区间中,随机选择一个元素作为分区点。
归并排序(Merge Sort)
归并排序算法(递归法)的操作如下:
- 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;
- 设定两个指针,最初位置分别为两个已经排序序列的起始位置;
- 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;
- 重复步骤 3 直到某一指针到达序列尾;
- 将另一序列剩下的所有元素直接复制到合并序列尾。
1 | // 归并排序算法 |
总结
原地排序 | 稳定的排序算法 | 最好 最坏 平均 | |
---|---|---|---|
快速排序 | 是 | 不是 | $$O(nlogn) O(n^2) O(nlogn)$$ |
归并排序 | 不是 | 是 | $$O(nlogn) O(nlogn) O(nlogn)$$ |