算法思想
数组排序任务可以如下完成:
1)把前一半排序
2)把后一半排序
3)把两半归并到一个新的有序数组,然后再拷贝回原数组,排序完成。
时间复杂度:o(nlogn),空间复杂度o(n)
(在前一半的排序中,又用到了归并算法,一直再分,直到待排序数组只有一个元素,因此归并排序需要用到递归来实现)

程序代码

#include<iostream>
using namespace std;
#define MAXSIZE 10
//归并排序需要额外的一个数组来存储中间结果
int a[100],b[100];//归并的过程中需要使用额外的存储空间来完成排序
void merge(int start,int mid,int end){//将数组a的局部a[s,m]和a[m+1,e]合并到b,并保证b有序,然后再拷贝回a[s,m] //归并操作时间复杂度:O(n) //我们为两个待归并的序列,各设一个指针,为我们的中转序列也设一个指针,都指向其开头 int i=start,j=mid+1,m=start;//看哪个指针所指向的值更小,如果小的话,我们就复制到目标数组中去,并且指针需要往后移 while(i<=mid&&j<=end){if(i<=mid&&a[i]<=a[j]){b[m++]=a[i++];} if(j<=end&&a[i]>a[j]){b[m++]=a[j++];} }//当上面的循环走完了之后,有一个指针会走到终点,接下来把另一个指针也走到终点 while(i<=mid){b[m++]=a[i++];}while(j<=end){b[m++]=a[j++];}for(int i=start;i<=end;i++){a[i]=b[i];}
}
void mergeSort(int start,int end){//实际上,递归的终止条件就是s不小于e。只有s<e的时候再做排序 if(start<end){int mid=(start+end)/2;     //将s和e分成两半 mergeSort(start,mid);        //前一半做排序 mergeSort(mid+1,end);     //后一半做排序 merge(start,mid,end);      //归并,将两个有序的序列归并到一起。 }
}
int main(){int n;cin>>n;for(int i=0;i<n;i++){cin>>a[i];} mergeSort(0,n-1);for(int i=0;i<n;i++){cout<<b[i]<<" ";} return 0;
}

时间复杂度分析

时间复杂度O(nlogn)

程序设计与算法----分治之归并排序相关推荐

  1. 程序设计与算法郭炜老师的课堂笔记2

    程序设计与算法郭炜老师的课堂笔记2 枚举 完美立方 生理周期 称硬币 熄灯问题 递归 求阶乘 汉诺塔 N皇后 逆波兰表达式 表达式求值 上台阶 放苹果 算24 二分算法 找一对数 分治 归并排序 快速 ...

  2. 图解排序算法(四)之归并排序

    图解排序算法(四)之归并排序 基本思想 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide) ...

  3. python选择排序算法图解_python基本算法之实现归并排序(Merge sort)

    0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...

  4. python 归并排序算法_python基本算法之实现归并排序(Merge sort)

    0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...

  5. java 排序算法总结,Java排序算法总结之归并排序

    本文实例讲述了Java排序算法总结之归并排序.分享给大家供大家参考.具体分析如下: 归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作.和快速排序类似,让我们一起来看 ...

  6. 排序算法系列:归并排序算法

    概述 上一篇我们说了一个非常简单的排序算法--选择排序.其复杂程序完全是冒泡级的,甚至比冒泡还要简单.今天要说的是一个相对比较复杂的排序算法--归并排序.复杂的原因不仅在于归并排序分成了两个部分进行解 ...

  7. 算法模板:归并排序【沈七】

    本文已收录于专栏 ⭐️ <算法通关笔记>⭐️ 算法模版:归并排序 前言 基本概念 算法思想 常用模板 完结散花 参考文献 前言 唤我沈七就好. 往期专栏: 算法模板:快速排序 基本概念 归 ...

  8. 五大常用算法——分治算法详解及经典例题

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

  9. python程序设计与算法基础江红答案_《Python程序设计与算法基础教程(第二版)》江红 余青松,第十一章课后习题答案...

    推荐阅读 <Python程序设计与算法基础教程(第二版)>江红 余青松 全部章节的课后习题,上机实践,课后答案,案例研究 文章目录 一些知识点总结和几个例题 选择题:1~5 填空题:1~8 ...

最新文章

  1. 每天一个linux命令(9):touch命令
  2. C++ 40行超级加速命令
  3. Lunar New Year and Number Division
  4. java主流微服务框架_Spring Boot作为当下最流行的微服务开发框架,一名合格的Java开发者一定有所了解,...
  5. JsonPath工具类封装
  6. php中throw try,PHP的Try, throw 和 catch简单用法_PHP教程
  7. 蓝桥杯 ADV-81 算法提高 数的运算
  8. 分享三:mysql跨库查询
  9. 山大824计算机基础,山大考研辅导班:山东大学2020年824计算机基础考研自命题科目考试大纲...
  10. HTML如何实现简单登录页面
  11. 面试——游戏测试工程师(20190918)
  12. 从vivo Photo Lab“影像实验室”透视门店新价值
  13. 新媒体运营适合什么样的人
  14. 【深度学习】基于深度学习的linux服务器,需要搭建哪些服务,一步步搭建深度学习的环境,cuda,pytorch,opencv,ftp服务, nfs服务 docker等等
  15. ACWing算法提高课 友好城市
  16. 【前沿进展】基于手机信令数据的交通出行特征研究
  17. PPT学习和制作笔记--排版
  18. webp的生成转换方法之图片转webp,包括生成webp动态图片
  19. 2022年12月编程语言排行榜,数据来了!
  20. 好的软件架构设计(zz)

热门文章

  1. 高通骁龙712移动平台正式发布!整体性能提升10%
  2. 虚拟资源拳王公社:做什么副业能最快赚到钱?虚拟副业是怎么赚钱的
  3. Java常用数据类型
  4. ffmpeg 无法找到libpostproc的问题
  5. iptables学习笔记:端口转发之“外网访问内网”
  6. 遇到一个把.o文件strip后出现的奇怪问题
  7. 当我的生活只剩下写代码时
  8. Java 替换字符串中的回车换行符的方法
  9. 【Kafka】Kafka客户端分配方案
  10. 【Flink】Flink 模拟 kafka 消费重启后 能接着读取 保存状态信息