排序--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大排序(三)-------冒 ...
 
随机推荐
- mkdir()和mkdirs()区别
			
mkdir()和mkdirs()区别如下: mkdirs()可以建立多级文件夹, mkdir()只会建立一级的文件夹, 如下: new File("/tmp/one/two/three&qu ...
 - find命令的简单使用
			
Find命令 格式:find [option] [Path] [筛选条件] [处理动作] Path:默认当前目录 筛选条件:对文件/目录设置筛选条件 处理动作:默认显示所有文件 筛选条件: -name ...
 - 【Kubernetes学习笔记】-使用Minikube快速部署K8S单机学习环境
			
介绍 https://minikube.sigs.k8s.io/docs/ Minikube 用于快速在本地搭建 Kubernetes 单节点集群环境,它对硬件资源没有太高的要求,方便开发人员学习试用 ...
 - 蒲公英 · JELLY技术周刊 Vol.29: 前端智能化在阿里的那些事
			
蒲公英 · JELLY技术周刊 Vol.29 前端智能化是指借助于 AI 和机器学习的能力拓展前端,使其拥有一些超出现阶段前端能力的特性,这将是未来前端方向中一场重要的变革.目前各家互联网厂商都有自己 ...
 - CentOS6.x 安装 nginx-1.19.4
			
1.下载nginx http://nginx.org/en/download.html wget http://nginx.org/download/nginx-1.19.4.tar.gz 2.解压 ...
 - VMware虚拟机 - 解决主机每次重启后 VMWare 都无法上网的问题
			
背景 每次重启自己电脑,重新打开 Vmware 虚拟机,再 ping 百度时,又显示无法 ping 通 但明明已经把 Vmware 的虚拟网卡重置了 那到底要如何解决呢? 解决方案 进入服务界面 将 ...
 - Kubernetes+Promethues+Cloud Alert实践分享
			
前言 容器集群管理系统 Kubernetes(简称K8s),为容器化的应用提供部署运行.容器编排.负载均衡.服务发现和动态伸缩等一系列完整功能,Prometheus 对 K8s 支持非常棒,能够自动发 ...
 - 主动关闭 tcp_timewait_state_process 处理
			
正常情况下主动关闭连接的一端在连接正常终止后,会进入TIME_WAIT状态,存在这个状态有以下两个原因(参考<Unix网络编程>): 1.保证TCP连接关闭的可靠性.如果最终发送 ...
 - 僵尸进程与SIGCHLD信号
			
什么是僵尸进程? 首先内核会释放终止进程(调用了exit系统调用)所使用的所有存储区,关闭所有打开的文件等,但内核为每一个终止子进程保存了一定量的信息.这些信息至少包括进程ID,进程的终止状态,以及该 ...
 - mysql建立索引,实际工作中建立索引的示例
			
1.根据业务场景建立相应的组合索引,一般是在主键,外键,常用来筛选查询的字段,按照字段之间组合的紧密程度,建立一定顺序的索引. 例如:为 t_org_exam_join_member_day 建立索 ...