合并排序的思路

本文将讨论用分治法来实现的合并排序。将问题拆分成几个规模较小但类似于原问题的子问题,再递归去求解这些子问题,最后再合并这些子问题的解来建立原问题的解。
每层递归时都有三个步骤:
分解:分解待排序的n个元素的序列成n/2个元素的两个子序列。
解决:使用归并排序递归得排序这两个子序列。
合并:合并两个已排序的子序列来产生最终答案。
事实上,当左右数组只含有1个元素的时候,这俩数组天然是已排序好的数组,就会向上合并。

时间复杂度分析

当一个算法中含有堆资深的递归调用时,其运行时间可以用递归方程来表示。假设有一个元素(或者叫规模)为n的原问题,我们可以这个原问题分解成a个子问题,每个子问题的元素是原问题的1/b,这些子问题通常可以用常数时间就解决,最后我们再把这些子问题的答案合并。其中,分解的步骤需要时间D(n), 合并时间为C(n)。
分治算法的递归方程皆基于三个步骤。
分解:分解该问题需要D(n)时间。
解决:当n<=c,即当子问题足够小,可以用常数时间解决,记它的时间为θ(1)。否则,需要T(n/b)的时间去解决,而这样的问题一共有a个。
合并:合并问题的时间为C(n)。
以下是递归方程:

那么,我们合并排序算法:
分解:分解仅仅需要算出中间位置,需要常量时间,D(n)=θ(1)。
解决:分成两半,每一部分的元素是总数的一半,所以时间是2T(n/2)。
合并:合并含有n个元素的数组,即merge方法的允许时间,与n线性相关,C(n)=θ(n)。
得:


图解如下:
最多有lgn层,每层需要常量c的时间,最底层一共有n个这样的子数组,可以近似为每一层都需要c*n的时间。由此观之,总的时间是θ(nlgn)。

主方法

主方法就是把数组分成两部分,递归求解,最后合并。
注意:

  • 当数组元素只有1个时不需要再进行分解,开始向上进行合并。
    public int[] mergeSort(int[] ints,int start, int last) throws Exception {//判断起始下标是否小于末尾下标,如果等于,则说明该数组只有1个元素,不需要再分解,可以进行向上合并了。if(start<last) {int mid = (start+last)/2;mergeSort(ints, start,mid);mergeSort(ints,mid+1,last);merge(ints,start,mid,last);}return ints;}public int[] mergeSort(int ints){return mergeSort(ints,1,ints.length);}

合并方法

  1. 创建并初始化左右数组。
  2. 从头开始比较两数组的元素大小,如果左数组元素小,就把此元素复制到A上,同时A和左数组的下标都加一。如果左数组下标到底了,就直接把右数组的所有元素复制到A上,右数组同理。

注意:

  • 合并的关键是默认左右数组都排序完成。而根据分治法的思想,当左右数组长度为1时,只有1个元素的数组就是已经排好序的数组,就可以向上合并。这个合并好的、排序完成的数组被当做左(右)数组, 再向上合并直到所有数组排序完成。
    public void merge(int[] A, int start,int mid, int last) throws Exception{//左数组的长度int n1 = mid-start+1;//右数组的长度int n2 = last-mid;//创建左数组int[] L1 = new int[n1];//创建右数组int[] L2 = new int[n2];//初始化左数组for(int i= 0;i<n1;i++) {L1[i] = A[start+i-1];}//初始化右数组for(int j = 0;j<n2;j++) {L2[j] = A[mid+j];}int i = 0, j = 0;//因为数组下标从0开始,所以k是start-1int k = start-1;try {//左右数组仍有元素没排完,则继续while(i < L1.length && j < L2.length) {//把左右数组中较小的那个元素拎出来放到A中if(L1[i] < L2[j]) {A[k] = L1[i];i++;k++;} else {A[k] = L2[j];j++;k++;}}//如果左边的数组还没比较完,右边的数都已经完了,那么将左边的数抄到大数组中while (i <n1) {A[k] = L1[i];i++;k++;}//如果右边的数组还没比较完,左边的数都已经完了,那么将右边的数抄到大数组中while (j < n2) {A[k] = L2[j];k++;j++;}} catch (Exception e) {System.out.println("i="+i+" j="+j+" k="+k + " n1="+n1+" n2="+n2+ " start=" +start);}}

JAVA实现分治法的合并排序及解析相关推荐

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

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

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

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

  3. 算法:分治法之合并排序

    合并排序算法思想: 先将无序序列利用二分法划分为子序列,直至每个子序列只有一个元素(单个元素就是有序),然后再对有序子序列两两进行合并排序. 合并方法是循环地将两个有序子序列当前的首元素进行比较,较小 ...

  4. java根号n元素的合并排序算法_分治算法:根号n段合并排序算法

    问题: 将数组 a[0,n-1]划分为 根号n 个子数组,每个子数组有 O(根号n)个元素.然后递归地对分割后的子数组进行排序,最后将所得到的根号n 个排好序的子数组合并排序. 工具与语言 我选择的为 ...

  5. java最接近对点及距离_最接近点对问题_分治法

    一.问题描述 给定平面上的n个点,找其中的一对点,使得在n个点组成的所有点对中该点对间的距离最小. 二.解题思路及所选算法策略的可行性分析 思路:利用分治法来解决问题.递归子结构求最接近点对总体可分为 ...

  6. 分治法解决最近点对问题

    问题 给定平面上n个点,找其中的一对点,使得在n个点的所有点对中,该点对的距离最小.严格地说,最接近点对可能多于1对.为了简单起见,这里只限于找其中的一对. 原理(这段为抄袭https://blog. ...

  7. 分治法-最接近点对问题

    背景: 计算机应用中经常采用点.圆等简单的几何对象表示物理实体,常需要了解其邻域中其他几何对象的信息 例如:在空中交通控制中,若将飞机作为空间中的一个点来处理,则具有最大碰撞危险的两架飞机所处的点对, ...

  8. 分治法在排序算法中的应用(JAVA)--归并排序

    分治法最常用的就是将规模为n的实例划分成两个n规模为n/2的实例 .推广到一般的情况,我们可以将规模为n的实例划分为b个规模为n/b的实例.这样对于算法的运行时间存在递推式:T(n) = aT(n/b ...

  9. 从合并排序算法看“分治法”

    本文内容 分治策略 分治步骤 从合并排序看"分治策略" 分治策略 分治法(divide-and-conquer),"分治法策略"是一种很重要的算法.顾名思义,& ...

最新文章

  1. 华为CodeCraft2017算法结果检查工具(包含测试用例展示)
  2. ubuntu16.04配置量化投资tensorflow/pytorch深度学习环境
  3. 【机器视觉】 if算子
  4. 使用github+hexo搭建静态blog
  5. spark-streaming连接flume时报错org.jboss.netty.channel.ChannelException: Failed to bind to: /IP:PORT
  6. 并发编程大师系列之:CountDownLatch和Join
  7. 华为悦盒EC6109U(联通IPTV机顶盒)
  8. PHP 获取微视无水印源地址_PHP实现西瓜视频、头条视频地址提取 无水印视频解析 视频去水印源码...
  9. 我是如何黑掉惠普打印机的
  10. 从东南大学906被刷到调剂过程(内含个人感想)
  11. 浅谈canvas绘画王者荣耀--雷达图
  12. 俄罗斯方块(Tetris)
  13. cad lisp程序大集_cad lisp程序
  14. Servlet.service() for servlet SpringMVC threw exception ---- java.lang.NullPointerException
  15. 互联网创业如何起步(一)
  16. 程序员翻车时的 30 种常见反应!
  17. MySQL数据库 - 初识MySQL
  18. 基于centos部署的 漏洞扫描工具(afrog)
  19. JAVA 连接 Hbase1.2.3查询
  20. 计算机未来的发展趋势

热门文章

  1. Mac idea 导入maven 工程提示 Malformed \uxxxx encoding
  2. 解决页面刷新数据丢失,数据持久化问题
  3. docfx 做一个和微软一样的文档平台
  4. 用Johnson-Trotter算法生成排列!
  5. Excel +VBA +ADO+Access数据库分页显示
  6. 哪个工具可以保护计算机免受ESD的影响,可以避免ESD影响的实用解决方案
  7. 实验四-哈夫曼编码的MATLAB实现
  8. numpy ndarray 与 array
  9. 计算机一级execl怎么学,【计算机一级 excel】大学计算机一级excle
  10. spring事务管理配置