归并排序
归并排序#
二路归并排序#
-
初始时,将每个记录看成一个单独的有序序列,则n个待排序记录就是n个长度为1的有序子序列
-
对所有有序子序列进行两两归并,得到n/2个长度为2或1的有序子序列--一趟归并
-
重复步骤2,直到得到长度为n的有序序列为止
-
上述排列过程中,子序列总是两两归并,称为2路归并排序。其核心是如何将相邻的两个子序列归并成一个子序列。
-
设相邻的两个子序列分别为:
-
{R[k],R[k+1],...R[m]}和{R[m+1],R[m+1],...R[h]}
-
将它们归并为一个有序的子序列
-
{DR[1],DR[1+1],...,DR[m],...,DR[m],DR[m+1],...,DR[h]}。
-
设有9个待排序的记录,关键字分别为
{23, 38, 22, 45, 23, 67, 31, 15, 41}
-
初始关键字:{ [23] [38] } { [22] [45] } { [23] [67] } { [31] [15] } [41]
-
第一趟:{ [23] [38] } { [22] [45] } { [23] [67] } { [15] [31] } [41]
-
第二趟:{ [22] [23] [38] [45] } { [15] [23] [31] [67] } [41]
-
第三趟:{ [15] [22] [23] [23] [31] [38] [45] [67] } [41]
-
第四趟:{ [15] [22] [23] [23] [31] [38] [41] [45] [67] }
void mergeSort(int A[], int low, int high){
if(low < high){
int mid = (low + high) / 2;
mergeSort(A, low, mid);
mergeSort(A, mid + 1, high);
mergeSort(A, low, mid, high);
}
}
时间复杂度分析#
- 平均情况下,O(nlog2n),最好情况下O(nlog2n),最坏情况下O(nlog2n)
空间复杂度#
- 归并排序需要转存整个待排序列,因此空间复杂度O(n)
表归并的时间#
- 与表长成正比,若一个表表长是m,另一个是n,则时间是O(m+n)
典型例题#
- 将两个各有n个元素的有序表归并为一个有序表,至少比较次数是 n
- 假设两个表都是递增有序表,第一个表的最后一个元素小于第二个表的第一个元素,仅需要n次元素比较
参考网址:
https://www.geeksforgeeks.org/merge-sort/
作者:BigBender
出处:https://www.cnblogs.com/BigBender/p/13394551.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!