归并排序算法
参考文章
优质文章:
归并排序概念
归并排序采用分治法,是一种高效且稳定的排序算法,归并排序的性能不受输入数据的影响。
算法思路
- 根据中点拆分
1
2
3int mid = left + (right - left) / 2; // 计算中点
mergeSort(nums, left, mid); // 递归左子数组
mergeSort(nums, mid + 1, right); // 递归右子数组 - 合并
1
merge(nums, left, mid, right);
完整代码
1 | /* 归并排序 */ |
算法分析
时间复杂度:O(nlogn)
划分产生高度为 logn 的递归树,每层合并的总操作数量为 n,因此总体时间复杂度为 O(nlogn)。空间复杂度:O(n)
递归深度为 logn,使用 O(logn) 大小的栈帧空间。合并操作需要借助辅助数组实现,使用 O(n) 大小的额外空间。稳定排序:在合并过程中,相等元素的次序保持不变。
优势区间:链表排序
对于链表,归并排序相较于其他排序算法具有显著优势,可以将链表排序任务的空间复杂度优化至 O(1)。
- 划分阶段:可以使用“迭代”替代“递归”来实现链表划分工作,从而省去递归使用的栈帧空间。
- 合并阶段:在链表中,节点增删操作仅需改变引用(指针)即可实现,因此合并阶段(将两个短有序链表合并为一个长有序链表)无须创建额外链表。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 ShameYang's Blog!