归并排序
分治思想的体现
时间复杂度: 最好,最坏,平均都是 O(n * log n)
空间复杂度: 需要额外 O(n) 的空间
稳定性: 由于不存在交换操作,所以是稳定的排序
原理: 长度为n的表,划分为n个部分,两两进行合并,最终得出一个有序表
不断地递归分割整个表(分治),直到每个元素都是单独的一个表,然后将元素两两合并
合并操作是怎么进行的?
- 同时遍历两个表,使用两个指针分别指向两个表中的元素,并实现索引
- 比较两个表中当前指针指向的元素,将较小(大)的元素先后加入新的数组,并让指针加一
- 最终使归并得到的表以一张新表加入下一轮的归并,直到排序结束
在这个过程中,把表中每个元素都遍历了一遍,并且图中树的高度为logn,所以归并排序的时间复杂度为O(n * log n)
快速排序:
分治思想的体现
时间复杂度: 最好,平均 为 O(n * log n) , 最坏情况为 O(n2)
空间复杂度: O(log n) ~O(n)
稳定性: 由于产生了数值的交换,所以是不稳定的
原理:
- 选择一个基准元素(一般选择最左边的元素)
- 使用双指针,分别从左边和右边两个方向向中间移动
- 当前指针指向的数值小于或者大于基准元素的时候与基准值交换位置
- 将比基准元素小的交换到左边,比基准元素大的交换到右边,当左右指针重合时,然后以基准元素为界限分割整个表
- 分别对左右两边再进行一次上述操作,直到不可再分割。