排序--MergeSort 归并排序?
MergeSort 's implementation
MergetSort 的中心思想就是分治思想,通过解决每一个小问题来解决大问题
假设你有2个已经排好序的数组
数组[ 4 ][ 8 ] 和 数组[ 5 ][ 7 ] 进行排序
4 是第一个数组最小的值 和 第二个数组最小的值5 进行比较 4 < 5 所以最小的元素是4
排完第一个元素后是[ 4 ][ null ][ null ][ null ]
接着排第二个元素, 8 和 5 比较。5 比较小
所以是 [ 4 ][ 5 ][ null ][ null ],接着 第一个数组最小的值8 和第二个数组最好的值7 比较。 7 < 8
所以变成 [ 4 ][ 5 ][ 7 ][ 8 ]。
所以问题的关键就是先把2个 数组分别排序了。再merge到一个大的数组中。下面盗用一下别人的图。嘎嘎嘎

mergeSort的复杂度为NLgN。相当快的算法。并且是stable
下面给出具体的实现
//Time : N log(N) & wasting space that proportional to N
public static void sort(Comparable[] a) {
sort(a, new Comparable[a.length], 0, a.length - 1);
} //mid 的左右都已经是有序的了,
//这个是merge方法
//a 和辅助 数组的长度需要一致
/** i j
* [] [] [] [ ] []
* low mid hi
*/
private static void sort(Comparable[] a, Comparable[] aux, int low, int hi) {
if (low >= hi) return;
int middle = low + (hi - low) / 2;
sort(a, aux, low, middle); //sort left
sort(a, aux, middle + 1, hi); // sort right
merge(a, aux, low, middle, hi);
} /** i j
* [ ] [ ] [ ] [ ] [ ]
* low mid hi
*/
private static void merge(Comparable[] a, Comparable[] aux,int low, int middle, int hi) {
int i = low;
int j = middle + 1;
for (int k = low; k <= hi; k++)
aux[k] = a[k]; //把元素复制到辅助数组上 for (int k = low; k <= hi; k++) { //前面2个判断条件一定要在前面。
//要不然下面比较的时候 会出现空指针异常
//因为已经有可能j 已经超出了hi的大小
if (i > middle) a[k] = aux[j++];
else if (j > hi) a[k] = aux[i++];
else if (less(aux[i],aux[j])) a[k] = aux[i++]; //
else a[k] = aux[j++];
}
}
merge sort
https://github.com/Cheemion/algorithms/blob/master/src/com/algorithms/sort/MergeSort.java
排序--MergeSort 归并排序?的更多相关文章
- java泛型中使用的排序算法——归并排序及分析
一.引言 我们知道,java中泛型排序使用归并排序或TimSort.归并排序以O(NlogN)最坏时间运行,下面我们分析归并排序过程及分析证明时间复杂度:也会简述为什么java选择归并排序作为泛型的排 ...
- MergeSort 归并排序(java)
MergeSort 归并排序 排序思想:1,分解待排序的n个元素为两个子列,各为n/2个元素 2,若子列没有排好序,重复1步骤,每个子列继续分解为两个子列,直至被分解的子列个数为1 3,子列元素个数为 ...
- C# 插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序
C# 插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序 以下列出了数据结构与算法的八种基本排序:插入排序 冒泡排序 选择排序 高速排序 堆排序 归并排序 基数排序 希尔排序 ...
- 排序算法-归并排序(Java)
package com.rao.sort; import java.util.Arrays; /** * @author Srao * @className MergeSort * @date 201 ...
- 常见排序算法总结分析之选择排序与归并排序-C#实现
本篇文章对选择排序中的简单选择排序与堆排序,以及常用的归并排序做一个总结分析. 常见排序算法总结分析之交换排序与插入排序-C#实现是排序算法总结系列的首篇文章,包含了一些概念的介绍以及交换排序(冒泡与 ...
- 数据结构和算法(Golang实现)(23)排序算法-归并排序
归并排序 归并排序是一种分治策略的排序算法.它是一种比较特殊的排序算法,通过递归地先使每个子序列有序,再将两个有序的序列进行合并成一个有序的序列. 归并排序首先由著名的现代计算机之父John_von_ ...
- 算法實例-C#-歸併排序-MergeSort
# 算法实例 # 排序算法Sort 歸併排序MergeSort 算法說明 歸併的思路是任意兩個元素可以比較大小,那麼任意兩個有序的元素集合也可以通過比較大小的方式歸併成一個有序的元素集合 任何的無序元 ...
- 经典排序算法 - 归并排序Merge sort
经典排序算法 - 归并排序Merge sort 原理,把原始数组分成若干子数组,对每个子数组进行排序, 继续把子数组与子数组合并,合并后仍然有序,直到所有合并完,形成有序的数组 举例 无序数组[6 2 ...
- 程序员必知的8大排序(四)-------归并排序,基数排序(java实现)
程序员必知的8大排序(一)-------直接插入排序,希尔排序(java实现) 程序员必知的8大排序(二)-------简单选择排序,堆排序(java实现) 程序员必知的8大排序(三)-------冒 ...
随机推荐
- 计算机二级考试:Java
目录 第 1 章 Java 语言概论 第 2 章 基本数据类型 2.1 概述 2.1.1 标识符 2.1.2 关键字 2.1.3 常量 2.2 基本数据类型 第 3 章 运算符和表达式 3.2 算术运 ...
- iptables基础原理和使用简介
概念简介 名称 Netfilter/iptables模块有两部分组成: Netfilter框架以及iptables,iptables又分为iptables(内核空间)和iptables命令行工具(用户 ...
- Servlet学习笔记(二)
目录 Servlet学习笔记(二) Request对象 1.request和response对象: 2.request对象继承体系结构: 3.什么是HttpServletRequest ? 4.Htt ...
- fidder 学习
前提 你要清楚下面两个问题的答案 1.接口是什么? 2.抓包是什么? 在提一嘴 想要获取手机上的时时请求 首先要把手机和电脑连接同一个网络 也就是在同一频道上 开始 1.安装 Fidder Every ...
- MYSQL字段
这里我的测试环境是wampserver 选择数据库 选择表 或者创建数据库和表 SHOW DATABASES; 查看数据库 CREATE DATABASE 数据库名; 创建数据库 在 MySQL 中, ...
- 【QT】跨线程的信号槽(connect函数)
线程的信号槽机制需要开启线程的事件循环机制,即调用QThread::exec()函数开启线程的事件循环. Qt信号-槽连接函数原型如下: bool QObject::connect ( const Q ...
- 【软件配置】JDK+AndroidStudio4.1开发安卓APP环境安装和配置教程详细
目录 一.专业名词 二.搭建前资源准备 2.1 JDK资源下载 2.2 AndroidStudio下载 三.安装 3.1 JDK安装配置 3.2 AndroidStudio安装 四.创建安卓APP工程 ...
- mybatis 字符串比较 == 用法
private String deptLevel; <when test='deptLevel=="3"'> 正确 <when test="deptLe ...
- RPC协议实践入门
RPC 是什么 RPC(Remote Procedure Call) 是一个计算机通信协议.该协议允许运行与一台计算机的程序调用另一个地址空间的程序,是一个通过发送请求-接受回应进行信息交互的系统. ...
- MyBatis——MyBatis开发流程
创建项目(IDEA中) 在IDEA中创建 MyBatis项目,详细流程如下: 这里有一点需要注意,我们创建的是Maven项目,如果大家以前没有配置过Maven环境的话,在创建完项目之后,需要配置一下M ...