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 相关文章推荐
python 处理string到hex脚本的方法
Oct 26 Python
python读取几个G的csv文件方法
Jan 07 Python
python实现转盘效果 python实现轮盘抽奖游戏
Jan 22 Python
python 函数中的内置函数及用法详解
Jul 02 Python
Python使用qrcode二维码库生成二维码方法详解
Feb 17 Python
Pytorch高阶OP操作where,gather原理
Apr 30 Python
Python做图像处理及视频音频文件分离和合成功能
Nov 24 Python
利用Python+OpenCV三步去除水印
May 28 Python
Python排序算法之插入排序及其优化方案详解
Jun 11 Python
Python编解码问题及文本文件处理方法详解
Jun 20 Python
Python尝试实现蒙特卡罗模拟期权定价
Apr 21 Python
python数字图像处理实现图像的形变与缩放
Jun 28 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 数组遍历方法大全(foreach,list,each)
2010/06/30 PHP
PHP之生成GIF动画的实现方法
2013/06/07 PHP
YII中Ueditor富文本编辑器文件和图片上传的配置图文教程
2017/03/15 PHP
php使用fullcalendar日历插件详解
2019/03/06 PHP
JQuery扩展插件Validate 1 基本使用方法并打包下载
2011/09/05 Javascript
基于jquery可配置循环左右滚动例子
2011/09/09 Javascript
Javascript中的this绑定介绍
2011/09/22 Javascript
基于HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
2016/01/05 Javascript
巧方法 JavaScript获取超链接的绝对URL地址
2016/06/14 Javascript
node.js平台下的mysql数据库配置及连接
2017/03/31 Javascript
Vue数组更新及过滤排序功能
2017/08/10 Javascript
Vue cli3 库模式搭建组件库并发布到 npm的流程
2018/10/12 Javascript
巧妙运用v-model实现父子组件传值的方法示例
2019/04/07 Javascript
vue图片上传组件使用详解
2019/12/23 Javascript
Angular8 实现table表格表头固定效果
2020/01/03 Javascript
js对象简介与基本用法示例
2020/03/13 Javascript
详解Vue之计算属性
2020/06/20 Javascript
[01:04:20]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第一场 11.29
2020/12/02 DOTA
Python3中关于cookie的创建与保存
2018/10/21 Python
python pandas读取csv后,获取列标签的方法
2018/11/12 Python
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
2019/03/05 Python
详解python播放音频的三种方法
2019/09/23 Python
使用python制作游戏下载进度条的代码(程序说明见注释)
2019/10/24 Python
Django项目使用ckeditor详解(不使用admin)
2019/12/17 Python
CSS3实现翘边的阴影效果的代码示例
2016/06/13 HTML / CSS
Parfumdreams芬兰:购买香水和化妆品
2021/02/13 全球购物
高级编程求职信模板
2014/02/16 职场文书
旅游管理专业大学生职业规划书
2014/02/27 职场文书
消防安全责任书
2014/04/14 职场文书
欢迎标语大全
2014/06/21 职场文书
宣传标语大全
2014/07/01 职场文书
社区活动策划方案
2014/08/21 职场文书
2016年国陪研修感言
2015/11/18 职场文书
青年岗位能手事迹材料(2016推荐版)
2016/03/01 职场文书
实习员工转正的评语汇总,以备不时之需
2019/12/17 职场文书
python turtle绘图
2022/05/04 Python