排序算法-归并排序(Java)
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)的更多相关文章
- 常见排序算法(附java代码)
常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...
- 7种基本排序算法的Java实现
7种基本排序算法的Java实现 转自我的Github 以下为7种基本排序算法的Java实现,以及复杂度和稳定性的相关信息. 以下为代码片段,完整的代码见Sort.java 插入排序 /** * 直接插 ...
- 常见排序算法总结 -- java实现
常见排序算法总结 -- java实现 排序算法可以分为两大类: 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序. 线性时间 ...
- 十大经典排序算法(java实现、配图解,附源码)
前言: 本文章主要是讲解我个人在学习Java开发环境的排序算法时做的一些准备,以及个人的心得体会,汇集成本篇文章,作为自己对排序算法理解的总结与笔记. 内容主要是关于十大经典排序算法的简介.原理.动静 ...
- 几大排序算法的Java实现
很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...
- 经典排序算法 - 归并排序Merge sort
经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到所有合并完,形成有序的数组 举例 无序数组[6 2 ...
- 几种简单的排序算法(JAVA)
几种排序算法(JAVA) 一.代码 package com.hdwang; import java.util.Arrays; /** * Created by admin on 2017/1/20. ...
- 各排序算法的Java实现及简单分析
一,直接插入排序 //直接插入排序的算法时间复杂度分析: //如果输入为正序,则每次比较一次就可以找到元素最终位置,复杂度为O(n) //如果输入为反序,则每次要比较i个元素,复杂度为O(n2) // ...
- 几大排序算法的Java实现(原创)
几大排序算法的Java实现 更新中... 注: 该类中附有随机生成[min, max)范围不重复整数的方法,如果各位看官对此方法有什么更好的建议,欢迎提出交流. 各个算法的思路都写在该类的注释中了,同 ...
- 数据结构和算法(Golang实现)(23)排序算法-归并排序
归并排序 归并排序是一种分治策略的排序算法.它是一种比较特殊的排序算法,通过递归地先使每个子序列有序,再将两个有序的序列进行合并成一个有序的序列. 归并排序首先由著名的现代计算机之父John_von_ ...
随机推荐
- Computer-Hunters——测试总结
描述项目的测试工作安排 主要由每个组员在模块功能完成后对自己负责的模块进行测试. 测试工具选择和运用 前端:console界面 后端:人工测试 前端与后端交互:人工测试 测试用例文档pdf的githu ...
- BAT公司职级体系及薪水解密
BAT公司职级体系及薪水解密 互联网圈有这么一句话:百度的技术,阿里的运营,腾讯的产品.那么代表互联网三座大山的BAT,内部人才体系有什么区别呢? 先谈谈腾讯的体系. 首先是腾讯. 1.职级: 腾讯职 ...
- python读写符号的含义
r 打开只读文件,该文件必须存在. r+ 打开可读写的文件,该文件必须存在. w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失.若文件不存在则建立该文件. w+ 打开可读写文件,若文件 ...
- SpringBoot 第一篇:入门篇
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10819728.html 版权声明:本文为博主原创文章,转载请附上博文链接! 前言 博主从去年 ...
- SWIG 3 中文手册——4. 脚本语言
目录 4 脚本语言 4.1 两种语言的概览 4.2 脚本语言如何调用 C? 4.2.1 包装器函数 4.2.2 变量链接 4.2.3 常量 4.2.4 结构体与类 4.2.5 代理类 4.3 构建脚本 ...
- 集合类源码(六)Map(HashMap, Hashtable, LinkedHashMap, WeakHashMap)
HashMap 内部结构 内部是一个Node数组,每个Node都是链表的头,当链表的大小达到8之后链表转变成红黑树. put操作 final V putVal(int hash, K key, V v ...
- 关于预装操作系统的ThinkPad的分区建议
Think的个人电脑产品大部分预装有正版操作系统,当前新产品出厂时默认都是一个大分区“C”和一个恢复分区“Q”,很多用户都会要求客服人员提供分区服务,在这里我简单说一下关于分区的几点注意事项望各位参考 ...
- Python '\r', '\n', '\r\n' 的彻底理解
回车和换行的历史: 机械打字机有回车和换行两个键作用分别是: 换行就是把滚筒卷一格,不改变水平位置. (即移到下一行,但不是行首,而是和上一行水平位置一样) 回车就是把水平位置复位,不卷动滚筒. ...
- Redis(六)Lua脚本的支持
Redis为什么需要Lua脚本的支持 当应用需要Redis完成一些Redis命令不支持的特性时,要么扩展Redis client或者更甚至编写c扩展Redis server.这都大大造成了应用的实现的 ...
- 【01】Saltstack:从零开始 Saltstack
写在前面的话 最近一直都在整理以前的乱七八糟的笔记,所以会有很多老旧的东西都会被拉出来重新遛遛.算是再度系统的进行学习. 关于 Saltstack 的一些概念 Saltstack 是基于 Python ...