排序--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大排序(三)-------冒 ...
随机推荐
- 2.5远程仓的库使用-2.7Git别名
2.5 远程仓库的使用 查看远程仓库 git remote # -v 选项会显示需要读写远程仓库使用的 Git 保存的简写与其对应的 URL 添加远程仓库 git remote add <sho ...
- 【SpringBoot】06.SpringBoot访问静态资源
SpringBoot访问静态资源 1.SpringBoot从classpath/static的目录 目录名称必须是static 启动项目,访问http://localhost:8080/0101.jp ...
- python-找不到tk包
找不到-tk包 直接sudo apt-get install python3-tk 或者sudo apt-get install python-tk 百度上的方法不可信,还是直接这样一句命令来的实在
- 基于C++语言实现机动车违章处罚管理系统
这篇文章主要介绍了基于C++语言实现机动车违章处罚管理系统的相关资料,需要的朋友可以参考下 关键代码如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...
- jenkins配置邮件报错:501 mail from address must be same as authorization user
jenkins配置文件的时候,遇到如下报错: 我的配置是这样的: 最后发现是jenkins url下面的系统管理员邮件地址没写,填写与用户名一致就可以了.
- PF_PACKET抓包mmap
PACKET套接口创建 内核函数packet_create处理PF_PACKET套接口的创建工作.其参数sock->type决定了采用哪一种工作模式,如果参数type为SOCK_PACKET即第 ...
- 开发工具之Git(一)
目录 一.什么是Git 二.Git基本原理 三.Git用户交互 一.什么是Git 答:Git是一个分布式版本控制软件.另外提一句,它的开发者就是大名鼎鼎的Linux之父Linus. 版本控制,顾名思义 ...
- tensorflow的tfrecord操作代码与数据协议规范
tensorflow的数据集可以说是非常重要的部分,我认为人工智能就是数据加算法,数据没处理好哪来的算法? 对此tensorflow有一个专门管理数据集的方式tfrecord·在训练数据时提取图片与标 ...
- Ceph OSD服务失效自动启动控制
前言 服务器上面的服务会因为各种各样的原因失败,磁盘故障,权限问题,或者是服务过载引起超时,这些都可能引起 这个在ceph里面systemctl unit 默认有个on-fail restart,默认 ...
- 入坑 docsify,一款神奇的文档生成利器!
layout: postcategory: javatitle: 入坑 docsify,一款神奇的文档生成利器!tagline: by 沉默王二tags: - java Guide 哥是我认识的一个非 ...