合并排序算法思想:

先将无序序列利用二分法划分为子序列,直至每个子序列只有一个元素(单个元素就是有序),然后再对有序子序列两两进行合并排序。

合并方法是循环地将两个有序子序列当前的首元素进行比较,较小的元素取出,置入合并序列(这就是合并排序O(n)的辅助空间花销的来源,建立了一个新的空数组来接收排好序的子序列)的左边空置位,直至所有元素置入合并序列

怎么划分就怎么合并!!!!

(截图自B站up主:请叫我AXin 的视频)

解释:

     (0+8)/ 2 = 4  所以下标为4及左边的元素作为一个子数组,下标大于4的元素作为另一个子数组

       同理,(0+4)/  2 = 2  所以 下标为 0 1 2 的元素作为一个子数组,下标为3 4 的作为另一个子数组

     (0+2)/ 2 = 1 所以 下标为 0 1 的元素作为一个子数组,下标为2的元素作为另一个子数组,因为这个子数组只有一个元素,所以他就是有序数组,等待合并就行。

     (0+1)/ 2 = 0 所以下标为0 的元素作为一个子数组,下标为1 的又作为一个子数组,也划分完毕了。

      右边的元素划分也同理。

      都划分完毕后,就开始合并,怎么划分就怎么合并。

      小的数就放前面,例如子数组2 5 9   和子数组 7  12:

一开始两个指针分别指向2,7。因为2<7,所以2拎出来,指到5,5<7,拎出来,指针继续走指到9,9>7,所以7拎出来,现在合并序列为 2 5 7,第一个子数组没数了,加入12,就排好了

给定你一个长度为 n 的整数数列。请你使用归并排序对这个数列按照从小到大进行排序。

并将排好序的数列按顺序输出。

输入格式

输入共两行,第一行包含整数 n。

第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整个数列。

输出格式

输出共一行,包含 n 个整数,表示排好序的数列。

数据范围

1≤n≤100000

输入样例:

5
3 1 2 4 5

输出样例:

1 2 3 4 5
#include <iostream>
using namespace std;
const int N = 100010;
int n;
int arr[N];
int result[N];  //用于接收排序后的数组void merge_sort(int arr[],int left,int right)
{if(left>=right)  //递归出口{return;}int mid = (left + right)/2;merge_sort(arr,left,mid);  //递归调用左边子数组merge_sort(arr,mid+1,right); //递归调用右边子数组int k = 0;  //用来表示接收结果的数组的下标int i = left;  //左边子数组的首元素下标赋值给iint j = mid+1;  //右边子数组的首元素下标赋值给jwhile(i<=mid && j<=right){if(arr[i]<arr[j])  //较小者拎出来{result[k++] = arr[i++]; //指针逐步向后移动}else{result[k++] = arr[j++];  //注意是后缀自增,先赋值,再指向后一个元素}}//退出上面这个while循环说明i和j至少有一个到头了while(i<=mid) //j到头了,i还没到头{result[k++] = arr[i++]; //把左边子数组剩余的数依次加进去}while(j<=right)//i到头了,j还没到头{result[k++] = arr[j++];}for(int i = left,k = 0;i<=right;i++){arr[i] = result[k++];  //因为我们传递的参数是arr,所以排序结果赋值给arr}
}
int main()
{cin>>n;for(int i = 0;i<n;i++){cin>>arr[i];}merge_sort(arr,0,n-1);for(int i = 0;i<n;i++){cout<<arr[i]<<' ';}return 0;
}

算法:分治法之合并排序相关推荐

  1. 算法设计——用分治法查找数组元素的最大值和最小值、用分治法实现合并排序、最小费用问题、树的最大连通分支问题(代码实现)

    代码链接:pan.baidu.com/s/15inIth8Vl89R1CgQ_wYc2g  提取码:gf13 算法分析与设计第 1 次实验 时间 2020.3.31 地点 软件大楼 127 实验名称 ...

  2. 算法设计 (分治法应用实验报告)基于分治法的合并排序、快速排序、最近对问题

    一.名称 分治法应用 二.目的 1.掌握分治法的基本思想: 2.学会运用分治法解决实际系统设计应用中碰到的问题. 三.要求 1.实现基于分治法思想的合并排序: 2.实现基于分治法思想的快速排序: 3. ...

  3. JAVA实现分治法的合并排序及解析

    合并排序的思路 本文将讨论用分治法来实现的合并排序.将问题拆分成几个规模较小但类似于原问题的子问题,再递归去求解这些子问题,最后再合并这些子问题的解来建立原问题的解. 每层递归时都有三个步骤: 分解: ...

  4. 关于算法--分治法--合并排序

    分治法: 1.思想:①将问题的实例划分为同一个问题的几个较小的实例,最好拥有相同的规模:②对于较小的实例进行求解,一般使用递归法,在问题规模足够小的情况下也是用另一个算法:③如果必要的话,合并这些较小 ...

  5. 算法导论-排序算法-分治法

    1.分治法原理 所谓的分治指的就是分而治之,即将大规模的问题分解成几个较小规模的问题.通过对较小规模问题的求解达到对整个问题的的求解.当我们将问题分解成两个较小问题求解时的分治方法就是二分法. 分支的 ...

  6. 算法--分治法归并排序 python

    设计算法 我们可以选择使用的算法设计方法有很多,插入排序使用了增量方法:在排序子数组A[1-j-1]后,将单个元素A[ j ]插入子数组的适当位置,产生排序好的子数组A[1-j]. 而这次我们将考查另 ...

  7. C#内功修炼(算法)——分治法(一)

    分治法(递归的解决问题) 分治策略是:对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这 ...

  8. 五大常用算法——分治法,动态规划,回溯法,分支界限法,贪心算法

    (1) 分治法 将一个难以直接解决的大问题,分割成一些规模较小的相同问题 快速排序 快排也是分治的一个实例,快排每一趟会选定一个数,将比这个数小的放左面,比这个数大的放右面, 然后递归分治求解两个子区 ...

  9. 跟我一起学算法——分治法

    目录 1.定义 2.适用条件分析 3.步骤 应用1:归并排序 步骤 算法 算法分析 应用2:快速排序 基本思想 算法 算法分析 参考 @ 分治法(Divide and Conquer) 1.定义 对于 ...

最新文章

  1. 为什么说Netty是性能之王,因为它用了 Reactor 模型啊
  2. Java 设计模式之命令模式
  3. 【神经网络八股扩展】:自制数据集
  4. 图解JVM的Class文件格式(详细版)
  5. 论文 计算机网络安全现状的分析与对策,计算机网络安全现状的分析与对策(学年论文).pdf...
  6. 两个线程能在cpu中同时运行吗_多核和多线程那些事
  7. 使用 setTimeout 实现 setInterval
  8. idea通过svn上传_SVN客户端使用(Windows)图文详解
  9. 【PID优化】基于樽海鞘算法PID控制器优化设计含Matlab源码
  10. 电脑启动项,电脑启动项设置,详细教您怎么设置开机启动项
  11. 手把手教你如何创造睡后收入
  12. 光猫+路由器如何映射端口
  13. Clusterrolebindings 创建错误
  14. C++常见面试题总结
  15. struct sockaddr和struct sockaddr_in的强制类型转换
  16. 关于电脑CPU双核四线程
  17. 史上最全的Git使用手册
  18. FlappyBird开发总结(三)——小鸟脚本,让小鸟煽动翅膀
  19. 计算机游戏活动总结,关于亲子游戏活动总结最新三篇
  20. 【Unity游戏开发】Android中如何集成Unity3D项目——入门级踩坑

热门文章

  1. 机器学习—模型估计与优化—线性模型—最小二乘估计
  2. python斐波拉契数列(Fibonacci)
  3. Kafka坑之一:Lag与HW、LEO
  4. 数据结构第四篇——(一般)线性表(基于C语言)
  5. 完美解决 手机软键盘遮挡问题
  6. 耦合和解耦的概念解析!
  7. 如何查看linux当前版本
  8. 1 Go语言开发环境搭建详细教程+go常见bug合集【Go语言教程】
  9. FQDN (fully qualified domain name,完全限定域名)
  10. win10解决0xc000007b错误办法