归并排序
算法设计
归并排序采用分治策略实现对n个元素进行排序算法,是分治法的一个典型应用和完美体现,它是一种平衡,简单的二分分治策略,过程大致分为:
- 分解——将待排序的元素分成大小大致相同的两个子序列
- 治理——对两个子序列进行合并排序
- 合并——将排好序的有序子序列进行合并,得到最终的有序列。
递归树高nlogn
合并操作
- 新开辟一段数组,数组长为 $high- low +1$
1 | void merge(int arr[],int low,int mid,int high) |
递归操作
1 | void MergeSort(int A[],int low,int high) |
代码实现
1 |
|
算法分析
时间复杂度
- 分解: 这一步仅仅是计算出子序列的中间位置,需要常数时间O(1)
- 解决子问题:递归求解两个规模为n/2的子问题,所需时间为2T(n/2)
- 合并: Merge算法可以在O(n)的时间完成
所以运行总时间为
空间复杂度
程序中变量占用了一些辅助空间,这些辅助空间都是常数阶的,每调用一个适当大小的缓冲去,且退出时会释放。最多分配大小为n,所以空间复杂度为O(n),递归调用所使用的栈空间是O(logn) 因为递归树高logn
最后贴一段gif,便于理解
视频来自于可视化算法网站 https://visualgo.net/zh