基本思想
归并排序(Merge Sort)的基本思想是:分治
网上有很多关于基本思想的介绍,不想多说,感觉也记不住。
我们设想一下,如果有两个有序数组A,B,写一个方法merge,使其合并成一个有序的数组C,步骤如下:
- 创建一个临时数组C,长度为A,B数组长度之和。
- 从数组A,B的0下标处开始遍历,取A[indexA],B[indexB]两个元素,较小(假设从小到大排序)的元素放入临时数组,较大元素继续和对方下一个元素比较,直到某一个数组的元素全部放入临时数组。
- 将没有处理完的数组元素全部放到临时数组的后面。
- 返回临时数组。
上面的Merge方法中包含了排序的过程。现在的问题是如何得到两个有序的数组?很简单,采用分治的方法,自上而下,每次取一半,那么最终的得到的相邻两个元素各自形成数组,数组长度=1,自然有序,进行merge,得到长度=2的有序数组,再和同样相邻的长度=2的数组merge,得到长度=4,…….,最终达到有序。
图解
做个拆解图:
归并算法动态过程:
实现(java)
1 | import java.util.Arrays; |
复杂度
时间复杂度:$O(nlogn)$
空间复杂度:$O(n)$
稳定性:稳定
参考资料
https://www.runoob.com/w3cnote/merge-sort.html
最后
此文若有出入,请指出!
此致,敬礼!