算法思路
归并排序为 nlogn 时间复杂度的算法,是一种稳定的算法,大部分框架源码里面的排序算法都是采用归并排序。归并排序其实类似于二叉树的后序遍历。
归并排序的思路:
- 首先把数组分成 2 半,然后想办法把左边的数组排序,再想办法把右边的数组排序,之后再将它们归并起来
- 我们对左边和右边的数组进行排序的时候,再分别把左边和右边的数组分别分成一半,然后对每一个部分先排序再归并
- 对于 2 中的每一个部分,依然是先分半,再排序,后归并。
- 重复 3,当我们分到一定细度(每一部分只有 1 个数)的时候,没一个部分都是有序的。
- 逐步向上归并,当归并都最后一层的时候,就是有序数组了。
归并过程
- 先创建一个当前需要归并后结果数组一样长度的数组,并赋值
- 利用新创建数组中的 [0…mid] 与 [mid+1…r] 部分进行对比排序来对原数组赋值
- 这里用到双指针的方式对 l 和 mid+i 起始的两个索引进行维护
实现的代码
1 | // 自顶向下的归并排序 |
上面的说的归并排序主要是采用自顶向下的排序方式,在算法代码里,还涉及到了自低向上的归并排序,其过程是:
- 遍历所有元素,看一个元素,第二次看两个元素,第三次看4个元素。。。每次加上自己(加倍)
- 遍历 [0 ~ sz-1] [sz ~ 2sz-1] [2sz ~ 3sz-1]。。。进行归并,i + sz < n 判断用于防止越界
- 对 arr[i…i+sz-1] 和 arr[i+sz+sz-1] 进行归并
以上就是归并排序的2种实现方法,这里记录以下方便查阅与复习