一、什么是归并排序?

1.概念

归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法,归并排序对序列的元素进行逐层折半分组,然后从最小分组开始比较排序,合并成一个大的分组,逐层进行,最终所有的元素都是有序的

2.算法原理

基本思想

归并排序就是递归得将原始数组递归对半分隔,直到不能再分(只剩下一个元素)后,开始从最小的数组向上归并排序。

  1. 将一个数组拆分为两个,从中间点拆开,通过递归操作来实现一层一层拆分。
  2. 从左右数组中选择小的元素放入到临时空间,并移动下标到下一位置。
  3. 重复步骤2直到某一下标达到尾部。
  4. 将另一序列剩下的所有元素依次放入临时空间。
  5. 将临时空间的数据依次放入原数据数组

概念图

 动态图

分解的时候我们可以使用递归的方式进行

首先我们可以先定义三个变量,

数组的头部位置可以定义为 low,数组的尾部可以定义为high

因为每次分解都是要折半,所以我们可以定义数组的中间是 mid,如下图所示

我们从上图当中可以看到,我们每一次递归,都是将原来的mid当成新的high,一直到low = high的时候我们就已经可以说明我们将一个数据分离了出来。所以我们可以写以下代码来表示分。

public static void mergeSort(int[] a, int low, int high) {//首先判断 low 和 high是否指向一个地方if(low >= high) {return;}int mid = (low + high)/2;//先递归左边mergeSort(a, low, mid);//在递归右边mergeSort(a, mid+1, high);}

首先我们可以先递归左边,直到我们讲第一个值分离出去,然后再回溯,分离他右边的那个,如下如所以:

当递归完成之后我们该开始合并了

public static void mergeSort(int[] a, int low, int high) {//首先判断 low 和 high是否指向一个地方// 正常情况下就是 == if(low == high) {return;}int mid = (low + high)/2;//先递归左边mergeSort(a, low, mid);//在递归右边mergeSort(a, mid+1, high);//合并merge(a,low,mid,high);System.out.println(Arrays.toString(a));}

首先我们需要先弄懂一个地方就是合并是在哪里开始的。

首先我们要知道我们第一次回溯之后,将第二个元素分离了出来,第二个元素分离完成之后,也会回溯回去,那么此一次合并就是 值 6 和 5的合并。

下边我们为了演示选择了 5,6 , 1 , 3的合并过程

首先我们需要弄清楚,我们这里所谓的分离其实是概念意义上的,在我们的数组结构上其实并没有分离,而且由于回溯的原因 5,6 , 1 , 3是其实和上边是对应的关系,如图所示

下边我们来一步一步的展示整个合并的过程,

首先我么可以定义两个指针,s1和s2,然后在定义一个新的临时数组来存储数据

我们将指针s1的范围锁定在 s1<=min ,将指针s2的范围锁定在s2<=high,我们可以比较s1和s2当前指向的值的大小,将小的一方放入到临时数组当中去,直到s1或s2一方指向为空,那么就可以将另一方全部放入到临时数组当中去。然后将临时的代码在放回数组
代码如下:

代码如下:

package com.sen;import java.util.Arrays;public class Gui {public static void main(String[] args) {// TODO Auto-generated method stubint arr[] = {6,5,3,1,8,7,2,4};mergeSort(arr,0,arr.length-1);System.out.println("排序结果:"+Arrays.toString(arr));}public static void mergeSort(int[] a, int low, int high) {//首先判断 low 和 high是否指向一个地方// 正常情况下就是 == if(low == high) {return;}int mid = (low + high)/2;//先递归左边mergeSort(a, low, mid);//在递归右边mergeSort(a, mid+1, high);//合并merge(a,low,mid,high);System.out.println(Arrays.toString(a));}//合并public static void merge(int[] a,int low,int mid,int high) {//定义第一段int s1 = low;//定义第二段int s2 = mid+1;//定义临时数组int[] temp =new int[high-low+1];int i = 0;//判断s1,s2是否有数据,放入临时数组while(s1<=mid) {temp[i++]=a[s1++];}while(s2<=high) {temp[i++]=a[s2++];}for(int j = 0;j < temp.length;j++) {a[j+low]=temp[j];}}}

输出结果如下:

[5, 6, 3, 1, 8, 7, 2, 4]
[5, 6, 1, 3, 8, 7, 2, 4]
[1, 3, 5, 6, 8, 7, 2, 4]
[1, 3, 5, 6, 7, 8, 2, 4]
[1, 3, 5, 6, 7, 8, 2, 4]
[1, 3, 5, 6, 2, 4, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8]
排序结果:[1, 2, 3, 4, 5, 6, 7, 8]

二、归并排序算法特点
1.时间复杂度
归并排序算法每次将序列折半分组,共需要logn轮,因此归并排序算法的时间复杂度是O(nlogn)

2.空间复杂度
归并排序算法排序过程中需要额外的一个序列去存储排序后的结果,所占空间是n,因此空间复杂度为O(n)

3.稳定性
归并排序算法在排序过程中,相同元素的前后顺序并没有改变,所以归并排序是一种稳定排序算法

Java八大算法:归并排序相关推荐

  1. java 排序算法总结,Java排序算法总结之归并排序

    本文实例讲述了Java排序算法总结之归并排序.分享给大家供大家参考.具体分析如下: 归并操作(merge),也叫归并算法,指的是将两个已经排序的序列合并成一个序列的操作.和快速排序类似,让我们一起来看 ...

  2. java排序算法总结_排序算法总结及Java实现

    1. 整体介绍 分类 排序大的分类可以分为两种,内排序和外排序.在排序过程中,全部记录存放在内存,则称为内排序,如果排序过程中需要使用外存,则称为外排序.主要需要理解的都是内排序算法: 内排序可以分为 ...

  3. Java入门算法(数据结构篇)丨蓄力计划

    本专栏已参加蓄力计划,感谢读者支持 往期文章 一. Java入门算法(贪心篇)丨蓄力计划 二. Java入门算法(暴力篇)丨蓄力计划 三. Java入门算法(排序篇)丨蓄力计划 四. Java入门算法 ...

  4. Java入门算法(贪心篇)丨蓄力计划

    本专栏已参加蓄力计划,感谢读者支持 往期文章 一. Java入门算法(贪心篇)丨蓄力计划 二. Java入门算法(暴力篇)丨蓄力计划 三. Java入门算法(排序篇)丨蓄力计划 四. Java入门算法 ...

  5. Java十大排序算法总结,Java排序算法总结之冒泡排序

    本文实例讲述了Java排序算法总结之冒泡排序.分享给大家供大家参考.具体分析如下: 前言:冒泡排序(BubbleSort)就是依次比较相邻的两个数,将小数放在前面,大数放在后面. 下面让我们一起    ...

  6. Java排序之归并排序

    Java排序之归并排序 1. 简介 归并排序的算法是将多个有序数据表合并成一个有序数据表.如果参与合并的只有两个有序表,则成为二路合并.对于一个原始的待排序数列,往往可以通过分割的方法来归结为多路合并 ...

  7. Java排序之归并排序 1

    Java排序之归并排序 1. 简介 归并排序的算法是将多个有序数据表合并成一个有序数据表.如果参与合并的只有两个有序表,则成为二路合并.对于一个原始的待排序数列,往往可以通过分割的方法来归结为多路合并 ...

  8. Java刷算法:收藏大法

    Java刷算法怎么刷:持续更新中 算法技巧 算法一轮复习 Java API复习 输入与输出 java.io.* java.util.* 数组 **判断二维数组是否为空** **数组拷贝** **字符数 ...

  9. java语言算法描述_六大java语言经典算法

    在程序员们进行编程的时候,对各种数据的处理是少不了的,java语言算法在这个时候就十分重要了.数据算法有很多种,也并不区分哪种计算机语言使用,但是有程序员们常用的java语言经典算法,下面就简单介绍一 ...

  10. 寻找第K大元素的八大算法、源码及拓展

    寻找第K大元素的八大算法.源码及拓展 http://www.cnblogs.com/bethunebtj/p/4861378.html 一.问题描述 所谓"第(前)k大数问题"指的 ...

最新文章

  1. IAR编译器的常见问题
  2. spark UDAF
  3. 《浪潮之巅》读书笔记(中)
  4. Linq入门演练---(1)基本用法-分组,排序,内连接
  5. 网络摄像头4 cmos 0v9650,driver
  6. java语言怎样判断文件夹_JAVA语言之如何判断文件,判断文件夹是否存在的代码...
  7. 模拟电路概念知识体系梳理(基础部分)
  8. JAVA进阶教学之(8种包装类)
  9. CSS3-变换-过渡-动画
  10. 数据科学和人工智能技术笔记 十六、朴素贝叶斯
  11. Windows10安装Cmder(图文教程)
  12. java 方法的重载_Java中的方法和方法重载
  13. react ui框架_Web开发 React 学习(二十)连载基础篇大结局
  14. Audio之音频帧周期(四十三)
  15. matlab常用代码程序
  16. 计算机排版原理,课外计算机排版原理(高级版) 7.ppt
  17. 系统分析设计案例分析
  18. vue富媒体编辑器组件:vue-wangeditor的使用
  19. 电子产品使用感受之--小米床头灯第二代使用体验分享
  20. 百度智能云“护航”度小满金融 实现“两地三中心项目”落成

热门文章

  1. 2022-2028全球变压器测试行业调研及趋势分析报告
  2. java发送邮件工具类
  3. proteus元件图片_最完整的Proteus元件库元件名称及中英对照表下载
  4. 地类图斑代码大全_全国第二次土地调查土地分类代码含义.doc
  5. SAI2.0绘画软件中文版(已测可用)
  6. 我经历的学术与论文写作
  7. uniapp App权限开启
  8. Excel 插件‘Aspen process data ‘在VBA中的基本使用
  9. 如何关闭flashhelper的ff新推荐广告弹窗
  10. Keil系列教程(汇总)