归并排序介绍

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

归并排序思想示意图1-基本思想

说明:

可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。分阶段可以理解为就是递归拆分子序列的过程。

归并排序思想示意图2-合并相邻有序子序列:

再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤

归并排序的应用实例

给你一个数组, val arr = Array(9,8,7,6,5,4,3,2,1), 请使用归并排序完成排序。

代码

package sort;import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;public class MergeSort {public static void main(String[] args) {//        int[] arr = {8, 4, 5, 7, 1, 3, 6, 2};
//        int[] temp = new int[arr.length];   // 归并排序有一个额外的空间
//        mergeSort(arr, 0, arr.length - 1, temp);
//        System.out.println(Arrays.toString(arr));// 测速int[] arr = new int[80000000];for (int i = 0; i < 80000000; i++) {arr[i] = (int) (Math.random() * 80000);// 生成一个0-80000的数据}int[] temp = new int[arr.length];Date date1 = new Date();SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String date1Str = simpleDateFormat.format(date1);System.out.println("排序前的时间为:" + date1Str);mergeSort(arr,0,arr.length-1,temp);Date date2 = new Date();String date2Str = simpleDateFormat.format(date2);System.out.println("排序后的时间为:" + date2Str);}// 分+合方法public static void mergeSort(int[] arr, int left, int right, int[] temp) {if (left < right) {int mid = (left + right) / 2;// 向左递归进行分解mergeSort(arr, left, mid, temp);// 向右递归进行分解mergeSort(arr, mid + 1, right, temp);// 到合并merge(arr, left, mid, right, temp);}}// 合并的方法/*** @param arr   待排序原始数组* @param left  左边有序序列初始索引* @param mid   中间索引* @param right 右边索引* @param temp  中转数组*/public static void merge(int[] arr, int left, int mid, int right, int[] temp) {int i = left;   // 初始化i,左边有序序列的初始索引int j = mid + 1;// 初始化j,右边有序序列的初始索引int t = 0;  // 指向temp数组的当前索引// (一)先把左右两边的数据按规则填充到temp数组,直到左右两边有序序列有一边处理完毕为止while (i <= mid && j <= right) {// 如果左边的有序序列的当前元素小于等于右边有序序列的当前元素// 即将当前的左边元素,拷贝到temp数组// t和i后移if (arr[i] <= arr[j]) {temp[t++] = arr[i++];} else { // 反之将右边的当前数据填充到temp数组temp[t++] = arr[j++];}}// (二)把有剩余数据的一边的剩余数据依次全部填充到tempwhile (i <= mid) {  // 左边的有序序列仍有剩余,将其全部填充到temptemp[t++] = arr[i++];}while (j <= right) {// 右边的有序序列仍有剩余,将其全部填充到temptemp[t++] = arr[j++];}// (三)将temp数组的元素拷贝到arr// 注意,并不是每次都拷贝所有t = 0;int tempLeft = left;while (tempLeft <= right) {arr[tempLeft++] = temp[t++];}}}

Java编程:排序算法——归并排序相关推荐

  1. 在线编程——排序算法总结

    在线编程--排序算法总结 找实习,阿里一面遇到手写快排,写出来感觉没错(VS2013能通过),但在阿里的测试平台上运行未通过.细思极恐,赶紧总结一波.有幸看到SteveWang的两篇博客:排序算法总结 ...

  2. Java经典排序算法

    提示:本文仅供自己学习 Java经典排序算法 一.排序算法概念及分类 1.排序概念 2.排序分类 二.十大排序算法 1.冒泡排序(BubbleSort) 2.选择排序(Selection sort) ...

  3. Java常见排序算法

    Java常见排序算法 转载于:https://www.cnblogs.com/hfultrastrong/p/7829889.html

  4. Java常见排序算法之插入排序

    一.概述 本节由小千给大家分享Java常见排序算法之插入排序,之前我们说过排序是算法中的一部分.所以我们学习排序也是算法的入门,为了能让大家感受到排序是算法的一部分,我举个例子证明一下:比如麻将游戏, ...

  5. 经典排序算法 - 归并排序Merge sort

    经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每一个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到全部合并完,形成有序的数组 举例 无序数组[6 ...

  6. python排序算法——归并排序(附代码)

    python排序算法 --归并排序 文章目录 python排序算法 --归并排序 一.前言 二.算法描述 三.代码实现 总结 一.前言 相关知识来自<python算法设计与分析>.初级排序 ...

  7. java treemap 排序原理,Java TreeMap排序算法实例

    本文实例讲述了Java TreeMap排序算法.分享给大家供大家参考,具体如下: TreeMap 和 HashMap 用法大致相同,但实际需求中,我们需要把一些数据进行排序: 以前在项目中,从数据库查 ...

  8. Java经典排序算法:选择排序,动图演示排序过程

    Java经典排序算法:选择排序,动图演示排序过程 示意动图: public class Main {public static void main(String[] args) {new Main() ...

  9. 十大经典排序算法-归并排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  10. 【Java】排序算法 之 【归并排序】 总结

    目录 1.合并两个有序数组函数 2. 归并排序 3. 非递归实现归并排序 1.合并两个有序数组函数 在学习归并排序之前,我们需要掌握合并两个有序数组为一个有序数组的函数是如何实现的 /*** 合并两个 ...

最新文章

  1. java栈、堆、方法区
  2. python3.6安装numpy-Python3.6的组件numpy的安装
  3. 回文数的JAVA程序
  4. Android 5.1 添加硬件抽象层(HAL)和JNI接口总结
  5. 【opencv】16.截取图像中的一个roi区域时,判断该roi是否越界
  6. 经典面试题(18):以下代码将输出的结果是什么?
  7. 图解算法之排序算法(1)——冒泡排序
  8. soapUI(groovy脚本作用2)请不要问为什么系列2
  9. stl之map 排序
  10. ai带来的革命_Covid-19将加速AI医疗保健革命
  11. Windows远程连接Linux虚拟机图形界面
  12. 项目开发文档编写规范【附文档模板】
  13. 小程序发布文章-微信小程序视频教程28
  14. Linux下SD卡驱动移植
  15. PostgreSQL中创建空间拓展(创建空间数据库)并连接到空间数据库,导入数据表操作
  16. 微信小游戏制作大厅里的排行榜(跟游戏内的排行榜有区别)
  17. ElasticSearch索引基本操作POST PUT GET DELETE
  18. jqGrid学习笔记
  19. linux查看端口pvid,交换机端口及常见问题定位(二)
  20. 【报错笔记】Windows下spacy en_core_web_sm安装解决方式

热门文章

  1. 1. crontab 简介
  2. 74. PHP 计数器
  3. 应用安全-软件安全-漏洞修复整理
  4. iOS开发常用技能点(持续更新中。。。)
  5. Django 分页 以及自定义分页
  6. ubuntu下安装python的gevent模块遇到的一个问题
  7. 64位sql server 如何使用链接服务器连接Access
  8. 央行超级网银8月上线 第三方支付平台或暂停接入
  9. zendstudio 的使用过程中出现 Editor could not be initialized. 的问题
  10. 通过DBlink获取不同数据库数据