程序设计与算法----分治之归并排序
算法思想
数组排序任务可以如下完成:
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)
程序设计与算法----分治之归并排序相关推荐
- 程序设计与算法郭炜老师的课堂笔记2
程序设计与算法郭炜老师的课堂笔记2 枚举 完美立方 生理周期 称硬币 熄灯问题 递归 求阶乘 汉诺塔 N皇后 逆波兰表达式 表达式求值 上台阶 放苹果 算24 二分算法 找一对数 分治 归并排序 快速 ...
- 图解排序算法(四)之归并排序
图解排序算法(四)之归并排序 基本思想 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide) ...
- python选择排序算法图解_python基本算法之实现归并排序(Merge sort)
0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...
- python 归并排序算法_python基本算法之实现归并排序(Merge sort)
0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...
- java 排序算法总结,Java排序算法总结之归并排序
本文实例讲述了Java排序算法总结之归并排序.分享给大家供大家参考.具体分析如下: 归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作.和快速排序类似,让我们一起来看 ...
- 排序算法系列:归并排序算法
概述 上一篇我们说了一个非常简单的排序算法--选择排序.其复杂程序完全是冒泡级的,甚至比冒泡还要简单.今天要说的是一个相对比较复杂的排序算法--归并排序.复杂的原因不仅在于归并排序分成了两个部分进行解 ...
- 算法模板:归并排序【沈七】
本文已收录于专栏 ⭐️ <算法通关笔记>⭐️ 算法模版:归并排序 前言 基本概念 算法思想 常用模板 完结散花 参考文献 前言 唤我沈七就好. 往期专栏: 算法模板:快速排序 基本概念 归 ...
- 五大常用算法——分治算法详解及经典例题
一.基本概念 在计算机科学中,分治法是一种很重要的算法.字面上的解释是"分而治之",就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题--直到最后子 ...
- python程序设计与算法基础江红答案_《Python程序设计与算法基础教程(第二版)》江红 余青松,第十一章课后习题答案...
推荐阅读 <Python程序设计与算法基础教程(第二版)>江红 余青松 全部章节的课后习题,上机实践,课后答案,案例研究 文章目录 一些知识点总结和几个例题 选择题:1~5 填空题:1~8 ...
最新文章
- 每天一个linux命令(9):touch命令
- C++ 40行超级加速命令
- Lunar New Year and Number Division
- java主流微服务框架_Spring Boot作为当下最流行的微服务开发框架,一名合格的Java开发者一定有所了解,...
- JsonPath工具类封装
- php中throw try,PHP的Try, throw 和 catch简单用法_PHP教程
- 蓝桥杯 ADV-81 算法提高 数的运算
- 分享三:mysql跨库查询
- 山大824计算机基础,山大考研辅导班:山东大学2020年824计算机基础考研自命题科目考试大纲...
- HTML如何实现简单登录页面
- 面试——游戏测试工程师(20190918)
- 从vivo Photo Lab“影像实验室”透视门店新价值
- 新媒体运营适合什么样的人
- 【深度学习】基于深度学习的linux服务器,需要搭建哪些服务,一步步搭建深度学习的环境,cuda,pytorch,opencv,ftp服务, nfs服务 docker等等
- ACWing算法提高课 友好城市
- 【前沿进展】基于手机信令数据的交通出行特征研究
- PPT学习和制作笔记--排版
- webp的生成转换方法之图片转webp,包括生成webp动态图片
- 2022年12月编程语言排行榜,数据来了!
- 好的软件架构设计(zz)