分析

数组排序任务可以如下完成:
1.把前一半排序
2.把后一半排序
3.把两半归并到到一个新的有序数组,然后再拷贝回原数组,排序完成。

归并排序的时间复杂度

对n个元素进行排序的时间:
T(n)=2T(n/2)+an (a是常数,具体多少不重要)
=2T(sT(n/4)+an/2)+an
=4T(n/4)+2an
……
=2k*T(n/2k)+kan
一直做到n/2^k=1(此时k=log(2,n)),
T(n)=2^kT(1)+kan
=2^k+k
an
=n+a
(log(2,n))*n
复杂度O(nlogn)

代码

#include <iostream>
using namespace std;
int a[10]={13,27,19,2,8,12,2,8,30,89};
int b[10];
void Merge(int a[],int s,int m,int e,int tmp[])
{//将数组a[s,m]和a[m+1,e]合并到tmp,并保存在tmp有序,然后再拷贝回a[s,m]。
//归并操作的时间复杂度是:O(e-m+1),即O(n)int pb=0;int p1=s,p2=m+1;while(p1<=m&&p2<=e){if(a[p1]<a[p2]){tmp[pb++]=a[p1++];}else{tmp[pb++]=a[p2++];}}while(p1<=m){tmp[pb++]=a[p1++];}while(p2<=e){tmp[pb++]=a[p2++];}for(int i=0;i<e-s+1;++i){a[s+i]=tmp[i];}
}
void MergeSort(int a[],int s,int e,int tmp[])
{if(s<e){int m=s+(e-s)/2;MergeSort(a,s,m,tmp);MergeSort(a,m+1,e,tmp);Merge(a,s,m,e,tmp);}
}
int main()
{int size=sizeof(a)/sizeof(int);MergeSort(a,0,size-1,b);for(int i=0;i<size;++i){cout<<a[i]<<",";}cout<<endl;return 0;
}

【分治的典型应用:归并排序】相关推荐

  1. (算法设计与分析)第二章递归与分治策略-第二节:分治和典型分治问题

    文章目录 一:分治法基本概念 (1)基本思想 (2)适用条件 (3)复杂度分析 二:典型分治问题 (1)二分搜索 (2)大整数乘法 A:大整数乘法(Karatsuba算法) B:字符串乘法 (3)St ...

  2. .NET6发布了Preview2,这点超越过去10年!

    从ASP.NET的性能诟病,到.NET Core的性能持续改进,在每一个.NET Core版本都能看到性能优化提升的介绍..NET Core3.1在各种性能排行中霸榜,.NET5再度提升了性能,前些天 ...

  3. .NET开源5年了,这些宝藏你还没get?

    从2016年微软发布.NET Core1.0,至今.NET开源也快5年了,GitHub也涌现了很多优秀的开源项目,关于CLR层面调优的讨论也多了起来,尤其是龙芯.NET开源的CLR迁移项目,更是让.N ...

  4. Java面试必问JVM调优,那.NET5呢?

    JVM调优已经是普通Java工程师的必修课了,而.NET开源快5年了,CLR层面的优化到目前都不多见,甚至常用的性能调优工具都还没玩过..NET5马上来了,要想在互联网大潮中逆袭,光靠平台是不够的,开 ...

  5. 都说性能调优难?玩转这3款工具,让你秒变“老司机”!

    鲁迅说过:菜鸟写业务,老鸟搭架构,高手玩调优.性能调优可谓是食物链顶端的技术,高薪面试必备良品.然而有不少的开发者,工作多年,却对性能调优几乎一无所知,今天就带大家掰扯掰扯,从性能调优思路,到多款实战 ...

  6. Algorithms_算法思想_递归分治

    文章目录 引导案例 递归的定义 什么样的问题可以用递归算法来解决 递归如何实现以及包含的算法思 递归的公式 斐波那契数列代码实现 递归的时间复杂度和空间复杂度 递 与 归 递归的优化 优化方式一:不使 ...

  7. C语言分治算法求中位数,【算法复习】分治算法

    Outline 分治思想和递归表达式 大整数乘法 矩阵乘法的Strassen算法 快速傅里叶变化 基于分治的排序 merge-sort排序 快速排序 排序的下界问题 中位数和顺序统计量 最邻近点对 凸 ...

  8. 分治策略Divide and Conquer

    在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",通常是递归算法,就是 把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最 ...

  9. 归并排序相关题目(待编辑)

    315 327 493, 打卡,典型的不能再典型的归并排序实现,类似的逆序对的题目有如下:315(和本题一样),327,493, 做完这三道相信归并排序的理解会更加深入 1:归并排序 package ...

最新文章

  1. 深度学习如何选择模型
  2. linux swi 内核sp,Linux内核分析课程8_进程调度与进程切换过程
  3. 将Ojective-C代码移植转换为Swift代码
  4. linux ssh客戶端:termius介绍及安装
  5. 1.2.2 OSI参考模型(应用层、表示层、会话层、传输层、网络层、数据链路层、物理层)
  6. 无线网sdn服务器,什么是SDN,SDN网络与传统网络对比
  7. JAVA环境指定xms512_【JAVA学习】java虚拟机内存配置,-Xss256m -Xms512m -Xmx800m -XX:MaxPermSize=512m...
  8. linux sed写文件内容,Linux学习——文本处理:sed
  9. 初使用 ReportViewer 控件时遇到的一点小麻烦
  10. 京东金融以支付开启出海之旅,未来或拓展至消费金融
  11. sip 时序图_Tcl与Design Compiler (五)——综合库(时序库)和DC的设计对象(下)
  12. NOIP模拟 6.26
  13. 图割Graph-Cut的最大流实现
  14. 《Java 开发从入门到精通》—— 2.4 Java的运行机制
  15. Unity Android 使用UnityWebRequest Post 数据后,没有获得服务器返回的数据
  16. 小动物领养网站/宠物救助网站
  17. day 09 学习Python——Python模块读取xls、slx文件,python发邮件
  18. ps读写ddr3里面的数据 zynq_DDR3读写数据调试
  19. 蚂蚁森林在沙漠种植了5552万棵树,原来我也在做一件改变世界
  20. java去除中文括号小括号,或者英文括号

热门文章

  1. 使用AOP+Annotation实现操作日志记录
  2. JavaScript之childNodes属性、nodeType属性学习
  3. 浅析ThinkPHP缓存之快速缓存(F方法)和动态缓存(S方法)
  4. JSON表单提交(ajax异步刷新)
  5. 构造 Codeforces Round #275 (Div. 2) C. Diverse Permutation
  6. 一个简单的时间片轮转多道程序内核代码分析
  7. sqlserver结果集转为字符串
  8. oracle查询使用or,查询视图,使用or就用不上索引
  9. mysql数据库在什么上运行_mysql – 在所有数据库上运行SQL查询
  10. Django报错:ConnectionAbortedError: [WinError 10053] 你的主机中的软件中止了一个已建立的连接。...