Java分治归并排序算法实例详解


Posted in Python onDecember 12, 2017

本文实例讲述了Java分治归并排序算法。分享给大家供大家参考,具体如下:

1、分治法

许多有用的算法在结构上是递归的:为了解决一个给定的问题,算法一次或多次递归地调用其自身以解决紧密相关的若干子问题。这些算法典型地遵循分治法的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来建立原问题的解。

分治模式在每层递归时都有三个步骤:

(1)分解原问题为若干子问题,这些子问题是原问题的规模较小的实例。
(2)解决这些子问题,递归地求解各子问题。然而,若子问题的规模足够小,则直接求解。
(3)合并这些子问题的解成原问题的解。

2、归并排序算法

归并排序算法完全遵循分治模式。直观上其操作如下:

(1)分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列。
(2)解决:使用归并排序递归地排序两个子序列。
(3)合并:合并两个已排序的子序列以产生已排序的答案。

当待排序的序列长度为1时,递归“开始回升”,在这种情况下不要做任何工作,因为长度为1的每个序列都已排好序。归并排序算法的关键操作是“合并”步骤中两个已排序序列的合并。我们通过调用一个辅助过程Merge(A,p,q,r)来完成合并,其中A是一个数组,p、q和r是数组下标,满足p<=q<r。该过程假设子数组A[p,q]和A[q+1,r]都已排好序。它合并这两个子数组形成单一的已排好序的子数组并代替当前的子数组A[p,r]。

过程Merge按以下方式工作。回到我们玩扑克牌的例子,假设桌上有两堆牌面朝上的牌,每堆都已排序,最小的牌在顶上。我们希望把这两堆牌合并成单一的排好序的输出堆,牌面朝下地放在桌上。我们的基本步骤包括在牌面朝上的两堆牌的顶上两张牌中选取较小的一张,将该牌从其堆中移开(该堆的顶上将显露一张新牌)并牌面朝下地将该牌放置到输出堆。

下面是Merge的伪代码:

Merge(A,p,q,r):

tmp[1,..,r-p+1]
i = p
j = q+1
while i <= q && j <= r
  if A[i] <= A[j]
  tmp[k++] = A[i++];
  else
  tmp[k++] = A[j++];
  while i <= q
  tmp[k++] = A[i++];
  while j <= r
  tmp[k++] = A[j++];
  for k2 = 0 to tmp.length
  A[k2+p] = tmp[k2];

Java分治归并排序算法实例详解

现在我们可以把过程Merge作为归并排序算法中的一个子程序来用。下面的过程Merge_sort(A,p,r)排序子数组A[p,r]中的元素。若p>=r,则该子数组最多有一个元素,所以已经排好序。否则,分解步骤简单地计算一个下标q,将A[p,r]分成两个子数组A[p,q]和A[q+1,r],前者包含[n/2]个元素,后者包含[n/2]个元素。

Merge_sort(A,p,r):
if p < r
   q = (p+r)/2
   Merge_sort(A,p,q)
   Merge_sort(A,q+1,r)
   Merge(A,p,q,r)

为了排序整个序列A=(A[0],A[1],...,A[n]),我们执行初始调用Merge_sort(A,0,A.length),这里再次有A.length = n。图2-4自底向上地说明了当n为2的幂时该过程的操作。算法由以下操作组成:合并只含1项的序列对形成长度为2的排好序的序列,合并长度为2的序列对形成长度为4的排好序的序列,依此下去,直到长度为n/2的两个序列被合并最终形成长度为n的排好序的序列。

Java分治归并排序算法实例详解

3、Java代码实现

public class Merge_sort_test {
  public static void Merge(int[] A,int p,int q,int r){
    int[] tmp = new int[r-p+1];//声明一个临时数组,长度为要归并数组的长度
    int i = p;  //记住左边数组第一个元素的下标
    int j = q+1; //记住右边数组第一个元素的下标
    int k = 0;
    while(i <= q && j <= r){
      //左边数组元素和右边数组元素比较,把小的元素赋给临时数组
      if(A[i] <= A[j]){
        tmp[k++] = A[i++];
      }
      else{
        tmp[k++] = A[j++];
      }
    }
    //把左边剩余的数组元素赋给临时数组
    while(i <= q){
      tmp[k++] = A[i++];
    }
    //把右边剩余的数组元素赋给临时数组
    while(j <= r){
      tmp[k++] = A[j++];
    }
    //用临时数组元素覆盖原数组元素
    for(int k2 = 0;k2 < tmp.length;k2++){
      A[k2+p] = tmp[k2];
    }
  }
  public static void/*int[]*/ Merge_sort(int[] A,int p,int r){
    int q = (p+r)/2;
    if(p < r){
      //递归调用
      Merge_sort(A,p,q);
      Merge_sort(A,q + 1,r);
      //归并排序数据元素
      Merge(A,p,q,r);
    }
    //return A;
  }
  public static void main(String[] args) {
    //
    int[] A = {5,2,4,7,1,3,2,6};
    System.out.println("原始数据: ");
    for(int i = 0;i < A.length;i++){
      System.out.print(A[i] + " ");
    }
    System.out.println();
    Merge_sort(A,0,A.length -1);
    System.out.println("输出结果: ");
    for(int i = 0;i < A.length;i++){
      System.out.print(A[i] + " ");
    }
  }
}
Python 相关文章推荐
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
Jun 25 Python
Python中的map()函数和reduce()函数的用法
Apr 27 Python
Python使用xlrd模块操作Excel数据导入的方法
May 26 Python
Python实现配置文件备份的方法
Jul 30 Python
Python编程中使用Pillow来处理图像的基础教程
Nov 20 Python
小小聊天室Python代码实现
Aug 17 Python
浅谈python 读excel数值为浮点型的问题
Dec 25 Python
Python Pandas 箱线图的实现
Jul 23 Python
tensorflow实现在函数中用tf.Print输出中间值
Jan 21 Python
python误差棒图errorbar()函数实例解析
Feb 11 Python
如何基于windows实现python定时爬虫
May 01 Python
Python pip 常用命令汇总
Oct 19 Python
Python数据结构与算法之二叉树结构定义与遍历方法详解
Dec 12 #Python
Python数据结构与算法之图的基本实现及迭代器实例详解
Dec 12 #Python
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
Dec 12 #Python
你真的了解Python的random模块吗?
Dec 12 #Python
Python判断两个对象相等的原理
Dec 12 #Python
浅谈Django REST Framework限速
Dec 12 #Python
Django admin美化插件suit使用示例
Dec 12 #Python
You might like
PHP引用符&amp;的用法详细解析
2013/08/22 PHP
php中cookie实现二级域名可访问操作的方法
2014/11/11 PHP
thinkphp微信开之安全模式消息加密解密不成功的解决办法
2015/12/02 PHP
javascript 带有滚动条的表格,标题固定,带排序功能.
2009/11/13 Javascript
用Jquery实现可编辑表格并用AJAX提交到服务器修改数据
2009/12/27 Javascript
我用的一些Node.js开发工具、开发包、框架等总结
2014/09/25 Javascript
jQuery动态生成表格及右键菜单功能示例
2017/01/13 Javascript
JavaScript使用正则表达式获取全部分组内容的方法示例
2017/01/17 Javascript
vue params、query传参使用详解
2017/09/12 Javascript
Bootstrap treeview实现动态加载数据并添加快捷搜索功能
2018/01/07 Javascript
从理论角度讨论JavaScript闭包
2019/04/03 Javascript
JS回调函数原理与用法详解【附PHP回调函数】
2019/07/20 Javascript
JS常用正则表达式超全集(密码强度校验,金额校验,IE版本,IPv4,IPv6校验)
2020/02/03 Javascript
[57:59]EG vs Secret 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
python使用正则表达式检测密码强度源码分享
2014/06/11 Python
python如何去除字符串中不想要的字符
2020/07/05 Python
转换科学计数法的数值字符串为decimal类型的方法
2018/07/16 Python
python3实现点餐系统
2019/01/24 Python
python Elasticsearch索引建立和数据的上传详解
2019/08/04 Python
Python循环实现n的全排列功能
2019/09/16 Python
利用pyshp包给shapefile文件添加字段的实例
2019/12/06 Python
python3 deque 双向队列创建与使用方法分析
2020/03/24 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
2020/09/23 Python
Python类的继承super相关原理解析
2020/10/22 Python
以实惠的价格提供高品质的时尚:Newchic
2018/01/18 全球购物
高级护理专业大学生求职信
2013/10/24 职场文书
留学生如何写好自荐信
2013/12/27 职场文书
信息专业大学生自我评价分享
2014/01/17 职场文书
2014迎新年晚会策划方案
2014/02/23 职场文书
社区爱国卫生月活动总结
2014/06/30 职场文书
2014年创先争优工作总结
2014/12/11 职场文书
后备干部推荐材料
2014/12/24 职场文书
大足石刻导游词
2015/02/02 职场文书
党员年终个人总结
2015/02/14 职场文书
基于Redis位图实现用户签到功能
2021/05/08 Redis
《雀魂PONG☆》4月1日播出 PV角色设定情报
2022/03/20 日漫