package com.rao.sort;

import java.util.Arrays;

/**
* @author Srao
* @className MergeSort
* @date 2019/12/7 10:24
* @package com.rao.sort
* @Description 归并排序
*/
public class MergeSort {
/**
* 归并排序:递归写法
* @param arr:要排序的数组
* @param left:数组最左边的元素的下标
* @param right:数组最右边的元素的下标
*/
public static int[] mergeSort(int[] arr, int left, int right){
//如果left == right,那么说明数组中只有一个元素了
if (left < right){
int mid = (left + right) / 2;
arr = mergeSort(arr, left, mid);//对左边的部分进行归并排序
arr = mergeSort(arr, mid+1, right);//对右边的部分进行归并排序
merge(arr, left, mid, right);//将上面两部分进行合并,变成一个有序的数组
}
return arr;
} /**
* 归并排序:非递归写法
* @param arr:要排序的数组
* @return
*/
public static int[] mergeSort2(int[] arr){
int n = arr.length;
//分组时每一轮数组的长度为1,2,4,8,16....
for (int i = 1; i < n; i = i+i){
int left = 0;
int mid = left + i - 1;
int right = mid + i;
while (right < n){
merge(arr, left, mid, right);
left = right + 1;
mid = left + i -1;
right = mid + i;
} //每一次分组合并之后可能会有多余的数组,不够2,4,8...,要把他们也合并到数组里面来
if (left < n && mid < n){
merge(arr, left, mid, n-1);
}
}
return arr;
} /**
* 对数组进行合并
* @param arr:要操作的数组
* @param left:从left到right之间进行合并
* @param mid
* @param right
*/
private static void merge(int[] arr, int left, int mid, int right) {
int i = left;//左边部分的起始下标
int j = mid+1;//右边部分的起始下标
int k = 0;//新数组的下标,新数组用来存放排好序的数字
int[] a = new int[right-left+1];//新数组
while (i <= mid && j <= right){
if (arr[i] < arr[j]){
a[k] = arr[i];
k++;
i++;
}else if (arr[i] >= arr[j]){
a[k] = arr[j];
k++;
j++;
}
}
//把没有排序的数字放入新数组
while (i <= mid){
a[k] = arr[i];
k++;
i++;
}
while (j <= right){
a[k] = arr[j];
k++;
j++;
}
//把新数组中的数字覆盖到旧数组中
for (int m = 0; m < a.length; m++){
arr[left+m] = a[m];
}
} public static void main(String[] args) {
int[] arr = {3, 6, 9, 5, 0};
System.out.println(Arrays.toString(arr));
arr = mergeSort(arr, 0, arr.length-1);
System.out.println(Arrays.toString(arr)); int[] arr2 = {3, 6, 9, 5, 0};
System.out.println(Arrays.toString(arr2));
arr2 = mergeSort2(arr);
System.out.println(Arrays.toString(arr2)); }
}

归并排序的思想:

  把数组一分为二,对左右两边分别进行归并排序,一直往下递归,直到数组不能再分,此时数组中只有一个元素,且一个元素是有序的,再把左右两部分进行合并,一直递归合并成一个有序数组。

排序算法-归并排序(Java)的更多相关文章

  1. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

  2. 7种基本排序算法的Java实现

    7种基本排序算法的Java实现 转自我的Github 以下为7种基本排序算法的Java实现,以及复杂度和稳定性的相关信息. 以下为代码片段,完整的代码见Sort.java 插入排序 /** * 直接插 ...

  3. 常见排序算法总结 -- java实现

    常见排序算法总结 -- java实现 排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间 ...

  4. 十大经典排序算法(java实现、配图解,附源码)

    前言: 本文章主要是讲解我个人在学习Java开发环境的排序算法时做的一些准备,以及个人的心得体会,汇集成本篇文章,作为自己对排序算法理解的总结与笔记. 内容主要是关于十大经典排序算法的简介.原理.动静 ...

  5. 几大排序算法的Java实现

    很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...

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

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

  7. 几种简单的排序算法(JAVA)

    几种排序算法(JAVA) 一.代码 package com.hdwang; import java.util.Arrays; /** * Created by admin on 2017/1/20. ...

  8. 各排序算法的Java实现及简单分析

    一,直接插入排序 //直接插入排序的算法时间复杂度分析: //如果输入为正序,则每次比较一次就可以找到元素最终位置,复杂度为O(n) //如果输入为反序,则每次要比较i个元素,复杂度为O(n2) // ...

  9. 几大排序算法的Java实现(原创)

    几大排序算法的Java实现 更新中... 注: 该类中附有随机生成[min, max)范围不重复整数的方法,如果各位看官对此方法有什么更好的建议,欢迎提出交流. 各个算法的思路都写在该类的注释中了,同 ...

  10. 数据结构和算法(Golang实现)(23)排序算法-归并排序

    归并排序 归并排序是一种分治策略的排序算法.它是一种比较特殊的排序算法,通过递归地先使每个子序列有序,再将两个有序的序列进行合并成一个有序的序列. 归并排序首先由著名的现代计算机之父John_von_ ...

随机推荐

  1. git强制合并另一个分支

    New分支和Old分支都修改了同样的部分,有冲突,但是想在Old分之上合并New分支的内容,并且以New分支为主,就是不自己手动解决冲突,碰到冲突,直接以New分支为主. 参考 https://git ...

  2. SpringBoot 系列教程自动配置选择生效

    191214-SpringBoot 系列教程自动配置选择生效 写了这么久的 Spring 系列博文,发现了一个问题,之前所有的文章都是围绕的让一个东西生效:那么有没有反其道而行之的呢? 我们知道可以通 ...

  3. HTTP之如何控制缓存

    HTTP控制缓存的能力 ===================摘自<HTTP权威指南>==================================== 服务器可以通过HTTP定义的 ...

  4. JDK1.8--API

    链接:https://pan.baidu.com/s/1mNlMIS1_8wFuQZ2vl2eTGg 提取码:e4yr

  5. c++小学期大作业攻略(三)用户系统

    Update at 2019/07/22 14:16 发现一个大坑,我们后期是打算用QSS统一堆样式进行美化的,于是我把之前对QLabel进行的setAlignment全部去掉了,打算统一丢进Qss里 ...

  6. Java 8——日期时间工具库(java.time)

    一.前言 在介绍Java SE 8中新的日期时间库前,先了解下Java 8之前的日期时间工具的诟病. 在Java SE 8前,日期时间工具库在java.util包中,包括: java.util.Dat ...

  7. 【03】Jenkins:SonarQube

    写在前面的话 SonarQube 这个服务有些人熟悉,有些人陌生.对于我们这样的运维人员,我们需要了解的是,SonarQube 是一个代码质量管理平台,懂得怎么安装配置,这其实就差不多足够了.我们在 ...

  8. PyTorch 之 DataLoader

    DataLoader DataLoader 是 PyTorch 中读取数据的一个重要接口,该接口定义在 dataloader.py 文件中,该接口的目的: 将自定义的 Dataset 根据 batch ...

  9. Jenkins的使用(三)-------Publish over SSH和Publish over FTP

    七.构建后操作 1.使用Publish over SSH 1.左边菜单栏    Manage Jenkins --->ManagePlugins--->可选插件,然后搜索 Publish ...

  10. C# word格式转换为pdf

    引用 Microsoft.Office.Interop.Word 这个dll,可以在解决方案浏览器中搜索到并下载. 源码如下: public bool WordToPDF(string sourceP ...