java 归并排序的实例详解
作者:lqh 发布时间:2021-12-06 22:58:05
标签:java,归并排序
java 归并排序的实例详解
归并排序
归并排序,指的是将两个已经排序的序列合并成一个序列的操作。
归并操作的过程如下:
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
设定两个指针,最初位置分别为两个已经排序序列的起始位置
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针到达序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
Java代码
/**
* 归并排序
*
* @param ts
*/
@SuppressWarnings("unchecked")
public static <T extends Comparable<? super T>> void mergeSort(T[] ts) {
// 辅助空间
T[] tempArray = (T[]) new Comparable[ts.length];
mergeSort(ts, tempArray, 0, ts.length - 1);
}
/**
* 递归
*/
private static <T extends Comparable<? super T>> void mergeSort(T[] ts, T[] tempArray, int left, int right) {
if (left < right) {
int center = (left + right) / 2;
mergeSort(ts, tempArray, left, center);
mergeSort(ts, tempArray, center + 1, right);
// 左右合并
merge(ts, tempArray, left, center + 1, right);
}
}
/**
* 合并
*/
private static <T extends Comparable<? super T>> void merge(T[] ts, T[] tempArray, int leftPos, int rightPos, int rightEnd) {
int leftEnd = rightPos - 1;
int temPos = leftPos;
int numElements = rightEnd - leftPos + 1;
while (leftPos <= leftEnd && rightPos <= rightEnd)
//比较放到辅助空间
if (ts[leftPos].compareTo(ts[rightPos]) <= 0)
tempArray[temPos++] = ts[leftPos++];
else
tempArray[temPos++] = ts[rightPos++];
while (leftPos <= leftEnd)
tempArray[temPos++] = ts[leftPos++];
while (rightPos <= rightEnd)
tempArray[temPos++] = ts[rightPos++];
//考回原数组,此处最好用System.arraycopy优化
for (int i = 0; i < numElements; i++, rightEnd--)
ts[rightEnd] = tempArray[rightEnd];
}
复杂度:O(n log n)
比较操作的次数介于(n log n)/2和n log n - n + 1。 赋值操作的次数是(2nlogn)。
归并算法的空间复杂度为:Θ(n)
稳定性:稳定
扩展:
在java中,当执行一次泛型排序时,进行一次元比较可能是昂贵的,但是移动元素则是省时间的。归并排序使用所有的流行的排序算法中最少的比较次数,因此是使用java的通用排序算中的上好的选择。
以上使用java 使用归并排序的简单实例,有关java算法知识本站还有很多,大家可以搜索,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
来源:http://flyouwith.iteye.com/blog/2178209#bc2394113


猜你喜欢
- 简介今天的课程开始进入高级课程类了,我们要开始接触网络协议、设备等领域编程了。在今天的课程里我们会使用OKHttp组件来访问网络资源而不是使
- 前几天在这里分享了手写 sql 分页查询实现分页,现在来看看使用 mybatis 分页插件 pagehepler 来实现分页使用分页插件的原
- 前言这篇文章的内容基于对Spring Security 认证流程的理解,如果你不了解,可以读一下这篇文章:Spring Security 认
- 本文将引导您完成 2 个示例,演示如何在 Flutter 中获取设备标识符使用 platform_device_id如果您只需要运行应用程序
- 前一段时间,在做摄像头拍照上传,摄像头拍的照片为base64编码格式的字符串,需要上传至项目中,则需要使用到将base64编码字符串转换为图
- instanceof 严格来说是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例,用法为:boolean result = o
- 前言公司最近在开发中遇到一个问题,在弄帖子的发布与回复问题,然后再iOS端和Android端添加表情的时候都会出错Caused by: ja
- Spring的事务隔离级别和事务的传播行为是面试中经常考察的问题,做个简单的总结。传播行为在SpringBoot中通过Transaction
- 在 Servlet/Jsp 项目中,如果涉及到系统任务,例如在项目启动阶段要做一些数据初始化操作,这些操作有一个共同的特点,只在项目启动时进
- 一、题干输入一个9*9二维数组表示数独,已经填入的数字用1-9表示,待填入的数字用0表示,试写一个算法解出数独并输出。二、思路容易想到回溯法
- 现在软件或者网页的并发量越来越大了,大量请求直接操作数据库会对数据库造成很大的压力,处理大量连接和请求就会需要很长时间,但是实际中百分之80
- 本文总结分析了Android编程开发之EditText中inputType属性。分享给大家供大家参考,具体如下:android 1.5以后添
- 效果图效果图依次为发现界面顶部,包含首页轮播图,水平滚动的按钮,推荐歌单;然后是发现界面推荐单曲,点击单曲就是直接进入播放界面;最后是全局播
- 实例如下:public class ConfigOperator { #region 从配置文件获取V
- android studio 版本不同连接手机方式有细微的不同,主要方式相似。介绍主要分手机和电脑两部分介绍。一、手机部分1、手机端下载一个
- 获取缓存大小接口主要这里的方法已经和7.0不兼容了。import android.app.usage.UsageStats;import a
- 网易Java程序员两轮面试题,请作答。part 1:网易JAVA程序员一面1.volatile有什么用?2.Minor GC和Full GC
- 目录1、Java内存模型2、硬件内存架构3、实际执行3.1 共享对象可见性3.2 竞争条件Java是一门支持多线程执行的语言,要编写正确的并
- 下面通过代码看下JAVA查询树结构数据(省市区)使用hutool工具实现代码:@PostMapping("/getTree&quo
- 修改FeginCilent定义的服务名到指定服务通过覆盖类来修改对应的服务名,这里将所有的FeginClient对应的服务名都修改好。pac