二路归并排序及时间复杂度分析
创作时间:
作者:
@小白创作中心
二路归并排序及时间复杂度分析
引用
CSDN
1.
https://blog.csdn.net/weixin_44870613/article/details/128935283
二路归并排序是一种高效的递归排序算法,其时间复杂度为O(nlogn)。本文将详细介绍二路归并排序的原理、实现代码以及时间复杂度分析,帮助读者深入理解这一经典算法。
序言
二路归并排序是一种效率极高的递归排序,将数组A化为有序数组时间复杂度为O(nlogn)。
思想
二路归并排序分为拆分数组以及合并两个操作。
切分(自上而下)时间复杂度2*T(n/2)
每次从数组A中间切分,将数组分为[low,mid]以及[mid+1,high]两段,直至不可再分(low不小于high)即最终分成最下层一个一个的数组。当然在代码中不会让他真的变成一个一个数组!用下标圈定范围即可。
合并(自下而上)时间复杂度T(n)
将两段各自有序的数组合并成一个有序数组,并逐步向上合并,最终得到一个有序数组。
下面举例分析如何进行合并操作,需要三个指针,我设为i,j,k
- 比较下面两个数组指针(i,j)所指位置的数值
- 将较小的放入上面的有序数组里,例如第一次比较17<28,故将17放入上面有序数组中的第一个位置。此时i++,k++即i,k向后移动一位
- 直至下面两个数组其中之一遍历完成,该例子为【17,24】遍历完成,而【28,40】并未遍历完成
- 最终将未遍历完的数组剩下部分复制到上面的那个有序数组里
辅助数组B的作用
在合并操作中,先将此次需要合并的A数组全部放入B中,即i,j所指向的数组B,没错,他俩实际上在代码中就是一个数组只不过人为的在中间分开了,分为[low,mid],[mid+1,high]两段而已。
再经历上述合并步骤,将这两段数组合并到A数组的原位置中[low,high]中。
即i,j指向的是B数组的元素,而k指向的是A数组的元素
代码
#include<iostream>
using namespace std;
#define n 16
//辅助数组--->空间复杂度O(n)
int* B = (int*)malloc((n + 1) * sizeof(int));
//合并
void merge(int A[], int low, int mid, int high) {
//将A复制到B
for (int k = low; k <= high; k++) {
B[k] = A[k];
}
int i, j, k;
//循环结束条件需要满足左右数组其中之一遍历结束
for (i = low, j = mid + 1, k = i; i <= mid && j <= high; k++) {
if (B[i] <= B[j])
A[k] = B[i++];
else
A[k] = B[j++];
}
//若左数组未遍历结束
while (i <= mid)A[k++] = B[i++];
//若右半数组未遍历结束
while (j <= high)A[k++] = B[j++];
}
//二路归并排序
void mergeSort(int A[], int low, int high) {
if (low < high) {
int mid = (low + high) / 2;
//左半数组--->T(n/2)
mergeSort(A, low, mid);
//右半数组--->T(n/2)
mergeSort(A, mid + 1, high);
//合并--->T(n)
merge(A, low,mid, high);
}
}
int main() {
int A[16] = {24,17,40,28,13,14,22,32,40,21,48,4,47,8,37,18};
mergeSort(A, 0, 15);
for(int i =0;i<n;i++)
cout << A[i]<<" ";
return 0;
}
时间复杂度分析
- 首先,每次将数组分为左半数组和右半数组mergeSort时间复杂度均为T(n/2)
- 合并操作merge空间复杂度为T(n)
- 故实际时间复杂度公式为
一、递归树法
每一层都是上一层的一半,共有logn层,而每一层都有一次时间复杂度为O(n)的合并操作,故时间复杂度为O(nlogn)
二、主定理法(推荐)
该式中a = 2 , b =2 , k = 1 满足第二个式子 即时间复杂度为o(nlogn)
热门推荐
老山战场上的女兵:一线战士们的精神支柱
史上最全艾滋病感染分析:深入剖析,共筑防线
科学选择适合自己的运动健身方式:健康评估、计划制订与兴趣导向
“药”您知道 | 还在“咖啡续命”吗?这8种“咖啡+药” 要不得
玩王者荣耀,哪款手机最适合?性能、续航等多维度解析
“哪吒”何以“炼”就?
世界级水平展会获国际称赞 “航展是认识中国的一扇窗”
Excel柱形图怎么做立体感
6天,忻州古城接待60.54万人次!
嵌入式开发常见问题解决方法
中国哪个省,痔疮比例最高?
12306抢票难?官方回应来了!
家庭测甲醛的简易方法
如何确保黄金交易的合法性?这些合法性要求如何影响交易流程?
原神克洛琳德武器怎么选择
猫咪眼睛生理盐水的使用方法和注意事项
固定资产报废原因及应对策略
初二数学,试题难度逐渐升级,思维转变决定未来
欧拉函数求n的互质数个数(零基础也能看懂)
开学季警惕电信诈骗 96110长沙反诈咨询专线为您护航
果树开花前需要施什么肥料
粳米和籼米的区别是什么?五常大米、泰国香米如何选购?
心理博士刘敏:孩子啃老不工作,家长该如何应对?
《短歌行》深度解析:人生苦短,求贤若渴
外国游客眼中的中国旅游:优点与槽点
田柾国八大闪光点:从害羞少年到全能艺人,BTS黄金忙内的成长之路
复旦大学附属华山医院:系统建设,描绘专科发展路线图
煲机必备,十首耳机试音曲目推荐!不煲机也收着吧,都是经典
大厨亲授油炸蒜香排骨秘籍,步骤详细,新手也能做出美味
饥荒帝王蟹攻略:打法技巧与刷新时间详解