java 算法之归并排序详解及实现代码
作者:lqh 发布时间:2021-12-27 01:52:11
标签:java,归并排序
java 算法之归并排序详解
一、思想
归并排序:将一个数组排序,可以先(递归地)将它分成两半部份分别排序,然后将结果归并起来;
二、概念
归并:将两个有序的数组归并成一个更大的有序数组;
三、特点
优点:能够保证将任意长度为N的数组排序所需要的时间和NlogN成正比;
缺点:需要额外的空间和N成正比;
四、实现方法
将两个不同的有序数组归并到第三个数组中;
先将前半部分排序,在将后半部分排序,然后在数组中移动元素而不需要使用额外的空间;
五、代码
/**
* 归并排序
*
* @author pengcx
*
*/
public class Merge extends Sort {
/** 归并所需的辅助数组 */
private static Comparable[] aux;
public static void main(String[] args) {
String[] a = { "d", "a", "w", "b", "q" };
Merge.sort(a);
show(a);
}
public static void sort(Comparable[] a) {
aux = new Comparable[a.length];
sort(a, 0, a.length - 1);
}
/**
* 排序数组的a[lo]至a[hi]元素
*
* @param a
* 数组a
* @param lo
* 最小元素位置lo
* @param hi
* 最大元素位置hi
*/
private static void sort(Comparable[] a, int lo, int hi) {
if (hi <= lo) {
return;
}
// 计算数组中间位置
int mid = lo + (hi - lo) / 2;
// 排序数组a左边的元素
sort(a, lo, mid);
// 排序数组a右边的元素
sort(a, mid + 1, hi);
// 合并数组a左边和右边的元素
merge(a, lo, mid, hi);
}
/**
* 将数组a的a[lo]至a[mid]的元素与a[mid]至a[hi]的元素合并
*
* @param a
* 合并的数组a
* @param lo
* 最小数组元素lo
* @param mid
* 中间元素位置mid
* @param hi
* 最大元素位置hi
*/
public static void merge(Comparable[] a, int lo, int mid, int hi) {
int i = lo, j = mid + 1;
for (int k = lo; k <= hi; k++) {
aux[k] = a[k];
}
for (int k = lo; k <= hi; k++) {
// 如果左边的元素用尽,取右边的元素
if (i > mid) {
a[k] = aux[j++];
}
// 如果右边的元素用尽,取左边的元素
else if (j > hi) {
a[k] = aux[i++];
}
// 如果右半边的当前元素小于左半边的当前元素,取右半边元素
else if (less(aux[j], aux[i])) {
a[k] = aux[j++];
}
// 如果右半边的当前元素大于等于左半边的当前元素,取左半边元素
else {
a[k] = aux[i++];
}
}
}
}
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
来源:http://blog.csdn.net/p106786860/article/details/17750515


猜你喜欢
- 本文基于jdk1.8进行分析关于HashMap的简介,可以参考这篇文章https://www.jb51.net/article/154177
- 可能开发安卓的人大多数都用过很多下拉刷新的开源组件,但是今天用了官方v4支持包的SwipeRefreshLayout觉得效果也蛮不错的,特拿
- 首先的效果图搜索到结果(这里我只是模拟数据,真正和服务器走得时候,返回来的数据都应该包含关键字的)模拟的没有搜索结果的界面具体实现在这插一句
- 在前一期中,我们做了悬浮头部的两个tab切换和下拉刷新效果,后来项目中要求改成三个tab,当时就能估量了一下,如果从之前的改,也不是不可以,
- 一.先说结论针对任何一个代码记录都进行Revert Commit操作:①不管此记录是commit未push,还是已经push过;②不管此记录
- 前言工作中是否有这样的场景,多个线程任务,如果所有线程完成到某个阶段,你希望知道所有线程均完成该阶段。当然你使用线程计数可以实现,只是不够优
- 经典排序算法 - 冒泡排序Bubble sort原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或
- Parcelable优点:google专门为安卓写的序列化接口性能好,内存开销小,效率高,写起来复杂缺点:各个机型可能有差异,Parcela
- 说在前面大一软件工程在读,java萌新一只,第一次写博客,技术很菜勿喷。如有错误欢迎指出!这个小程序是给朋友的生日礼物,耗时半天,实际写起来
- 日期和时间格式由 日期和时间模式字符串 指定。在 日期和时间模式字符串 中,未加引号的字母 'A' 到 'Z'
- 这篇文章主要介绍了springboot+springmvc实现登录拦截,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学
- 本文实例讲述了C#实现输入10个数存入到数组中并求max和min及平均数的方法。分享给大家供大家参考,具体如下:using System;u
- SQLite 介绍SQLite,是一款轻型的数据库,用于本地的数据储存。先说说优点,它占用资源非常的低,在嵌入式设备中需要几百K的内存就够了
- 之前使用springMVC+spring+mybatis,总是被一些繁琐的xml配置,有时候如果配置出错,还要检查各种xml配置,偶然接触到
- 本文较为详细的讲解了C#中Html.RenderPartial与Html.RenderAction的区别,具体分析如下:Html.Rende
- 本文实例为大家分享了Android实现图片点击 * 效果的具体代码,供大家参考,具体内容如下实现效果:需要注意的点:ValueAnimator
- 推荐阅读idea官网下载链接(对应版本号下载):https://www.jetbrains.com/idea/download/other.
- 本文实例讲述了C#使用GDI+创建缩略图的方法,分享给大家供大家参考。具体方法分析如下:C#的Gdi+还是相当好用的。创建缩略图步骤如下:1
- 本文实例讲述了Java使用JDBC实现Oracle用户认证的方法。分享给大家供大家参考,具体如下:两天时间写的小品,以前的J2EE环境基本使
- 1.获取Return返回值//存储过程//Create PROCEDURE MYSQL//