排序算法Java实现——归并排序

java实现排序算法之归并排序(2路归并) java实现归并排序讲解 阅读详情

归并排序(也可以叫合并排序),其实归并排序的本质就是合并排序。

它是与插入排序、交换排序、选择排序不同的一类排序方法,不同之处在于:

它要求:待排序序列是由若干个有序子序列组成。

那么究竟什么是归并排序呢?归并这个词到底是什么意思?

首先可以理解为就是合并,然后就是这个词的由来,可以说归并这个词是个生造词。 “归并”由merge翻译而来,所以归并排序亦可以翻译为:”合并排序“。因为此算法的关键就在于合并。


一、基本思想

归并排序是将两个或两个以上的有序序列合并成一个新的有序序列。本篇文章介绍的就是归并排序主要是将两个有序数据序列合并成一个新的有序序列。

合并的方法是比较各子序列的第一个记录的键值,最小的一个就是排序的第一个记录的键值。取出这个记录,继续比较各子序列现有的第一个记录的键值,便可以找出排序后的第二个键值。然后开始递归,最终得到排序结果。

所以归并排序的基础就是合并。

1)有序序列的合并

归并排序的核心是:两个有序子序列的合并。

此算法的执行时间为:O(n-h+1)。

这里就不上C++代码了。

2)二路归并排序

二路归并排序是将两个有序表合并成一个有序表的排序方法。

二路归并排序是稳定的。


归并排序算法的时间复杂度为O(nlog2n)


二、代码


C++代码很简单

...

JAVA代码挺复杂的

如下:

/*@(#)MergeSort.java   2017-4-25 
 * Copy Right 2017 Bank of Communications Co.Ltd.
 * All Copyright Reserved
 */

package com.sort.cn;

/**
 * TODO Document MergeSort
 * <p>
 * @version 1.0.0,2017-4-25
 * @author Singit
 * @since 1.0.0
 */
public class MergeSort {
	static int number=0;
    public static void main(String[] args) {
        int[] a = {24, 5, 98, 28, 99, 56, 34, 2 };
        printArray("排序前:",a);
        MergeSort(a);
        printArray("排序后:",a);
    }

    private static void printArray(String pre,int[] a) {
        System.out.print(pre+"\n");
        for(int i=0;i<a.length;i++)
            System.out.print(a[i]+"\t");    
        System.out.println();
    }

    private static void MergeSort(int[] a) {
        // TODO Auto-generated method stub
        System.out.println("开始排序");
        Sort(a, 0, a.length - 1);
    }

    private static void Sort(int[] a, int left, int right) {
        if(left>=right)
            return;
    
        int mid = (left + right) / 2;
        //二路归并排序里面有两个Sort,多路归并排序里面写多个Sort就可以了
        Sort(a, left, mid);
        Sort(a, mid + 1, right);
        merge(a, left, mid, right);

    }


    private static void merge(int[] a, int left, int mid, int right) {
    
        int[] tmp = new int[a.length];
        int r1 = mid + 1;
        int tIndex = left;
        int cIndex=left;
        // 逐个归并
        while(left <=mid && r1 <= right) {
            if (a[left] <= a[r1]) 
                tmp[tIndex++] = a[left++];
            else
                tmp[tIndex++] = a[r1++];
        }
            // 将左边剩余的归并
            while (left <=mid) {
                tmp[tIndex++] = a[left++];
            }
            // 将右边剩余的归并
            while ( r1 <= right ) {
                tmp[tIndex++] = a[r1++];
            }
            
            
           
            
            System.out.println("第"+(++number)+"趟排序:\t");
            // TODO Auto-generated method stub
            //从临时数组拷贝到原数组
             while(cIndex<=right){
                    a[cIndex]=tmp[cIndex];
                    //输出中间归并排序结果
                    System.out.print(a[cIndex]+"\t");
                    cIndex++;
                }
             System.out.println();
        }
}


输出结果:

排序前:
24	5	98	28	99	56	34	2	
开始排序
第1趟排序:	
5	24	
第2趟排序:	
28	98	
第3趟排序:	
5	24	28	98	
第4趟排序:	
56	99	
第5趟排序:	
2	34	
第6趟排序:	
2	34	56	99	
第7趟排序:	
2	5	24	28	34	56	98	99	
排序后:
2	5	24	28	34	56	98	99	

三、总结

从以上代码可以看出,归并排序算法需要递归的进行分解、合并,每进行一次归并排序需要调用一次merge()方法,每次执行merge()方法需要比较n次,

SO,

归并排序算法的时间复杂度为O(nlog2n)。

归并排序的空间效率较差。因为它需要一个与原始序列同样大小的辅助序列。

归并排序是稳定的。




【排序算法】归并排序原理及Java实现 归并排序就是利用归并的思想实现的排序方法。而且充分利用了完全二叉树的深度特性,因此效率比较高。其基本原理如下:对于给定的一组记录,利用递归与分治技术将数据序列划分成为越来越小的半子表,在对半子表排序,最后再用递归方法将排好序的半子表合并成为越来越大的有序序列。 经过第一轮比较后得到最小的记录,然后将该记录的位置与第一个记录的位置交换;接着对不包括第一个记录以外的其他记录进行第二次 阅读详情

相关推荐

变邻域搜索(VNS)原理梳理和应用细节-附求解VRPTW问题C++代码

文章目录1、简介-introduction2、VNS的基本机制2.1 变邻域下降方法-Variable Neighborhood Descent2.2基本变邻域搜索方法-Basic Variable Neighborhood Search2.3 终止准则3、VNS的拓展和混杂算法3.1 VNS的拓展3.2 变邻域分解搜索-Variable Neighborhood Decomposition Search3.3 偏变邻域搜索-Skewed VNS3.4 并行变邻域搜索-Parallel VNS4、VNS和其

dragon Fly的博客 6826

java实现归并排序(详解)

归并排序和快速排序都是基于分而治之的算法思想。 归并排序先将待排序的数组不断拆分,直到拆分到区间里只剩下一个元素的时候。不能再拆分的时候。这个时候我们再想办法合并两个有序的数组,得到长度更长的有序数组。当前合并好的有序数组为下一轮得到更长的有序数组做好了准备。一层一层的合并回去,直到整个数组有序。

古城的博客 2万+

SAR ADC设计——SAR Logic原理

SAR ADC设计——SAR Logic原理 参考:集成电路设计实践 SAR ADC 清华大学 李福乐 文章目录SAR ADC设计——SAR Logic原理一. Overview二. TSPC(True Single Phase Clock)三. SC_Gen(Sequential Control Generator)四. LATCH_Dynamic五. 时序控制逻辑总结六. SW产生七. DO产生八. GT产生九. SAR Logic模块总结 一. Overview 输入:CKC,CompB,SAMPL

夏风喃喃的博客 1万+

Java归并排序

归并排序(Merge Sort)是应用分治思想的一个典型例子。把一个待排序序列拆分为两个子序列,分别对两个子序列排序,子序列排序时也采用相同的方法,直至拆分后的两个子序列都是有序的,即长度为1的序列天然有序,这时停止拆分,将两个有序的子序列归并为一个更大的有序序列,与之前拆分时的路径相反,不断的归并有序子序列,最终归并为一个序列。这种将两个有序序列归并为一个有序序列的操作称为二路归并。

qq_38875964的博客 4058

IQA图像质量评价 数据集介绍(LIVE、TID2013、CSIQ、LIVEC、KonIQ-10K)

LIVE、TID2013、CSIQ、LIVEC、KonIQ-10K 数据集介绍

qq_37925923的博客 1万+

计算机网络-自顶向下方法 第三章课后习题答案(第七版)

复习题 R1. a) 就叫这个协议为简单传输协议STP(Simple Transport Protocol)。在发送方,STP从发送进程接收不超过1196字节的数据块、目标主机地址和目标端口号。STP向每个块添加一个4字节的头,并将目标进程的端口号放在头中。STP然后将目标主机地址和结果段提供给网络层。网络层将段交付给目的地主机的STP。目的主机基于STP检查段中的端口号,从段中提取数据,并将数据传递给由端口号标识的进程。 b) 在发送方,STP从发送进程接收不超过1192字节的数据块、目标主机地址和目标端

Erekilu的博客 2万+

归并排序

public class MergeSort{ // 我们的算法类不允许产生任何实例 private MergeSort(){} // 将arr[l...mid]和arr[mid+1...r]两部分进行归并 private static void merge(Comparable[] arr, int l, int mid, int r) { Compara

简国堂的博客 782

CentOS7环境下搭建 rsyslog 日志服务器,rsyslog+loganalyzer

1.系统环境部署 ip hostname 192.168.200.182 web 192.168.200.184 rsyslog-mysql 关闭防火墙、selinux、下载epel源 [root@web ~]# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/f

sehn_的博客 3754

归并排序详解,Java版描述。

为了简单起见,使用int类型数组讲述归并算法,后面扩展到其他类型的排序。 目录 1.2 排序思想 1.3 见名知意 1.4 抽象过程 1.5 实例操作 1.6 代码实现(JAVA版本) 1.6.1调用排序部分 1.6.2递归实体 1.6.3合并两个数组 1.7 代码实现(C语言版) 1.8 算法分析 1.9全部源码 1.1 用具体例子说明...

weixin_30539625的博客 1044

3.ESP32S3 AP 配网开发实战:HTTP 与 WebSocket 协议实现

本文介绍了基于ESP32S3的AP配网实现方案,通过HTTP协议提供配网网页,利用WebSocket实现双向通信。详细解析了HTTP和WebSocket协议特点,阐述了SPIFFS文件系统存储HTML网页的方法,包括分区表配置、CMakeLists设置和代码实现。工程采用模块化设计,包含WiFi管理、Web服务器、IO扩展等组件,支持手机浏览器直接配网。测试验证了从AP热点连接到路由器切换的全流程,并总结了SPIFFS操作、WebSocket通信等核心优化点。该方案无需专用APP,适合物联网设备快速部署场景

u011697185的专栏 960

Misc-RAR隐写

题目来自于:XCTF的SimpleRAR,由于涉及到许多新知识,所以写篇小文子记录一下。 一、下载完后是一个压缩包。 里面就有一个flag.txt,打开之后发现有一串字符是flag is not here,而且我们查看他的文件大小,只要十六字节,绝对不可能再藏着什么信息了。 然后把压缩包拉到010editor里面,发现一下子出来好多新的内容,很明显是有夹杂着的附加文件。 二、rar文件头信息。 rar 是由一个一个 block 组成的,每个 block 有以下几个部分 ...

admin的博客 1361

Java 与排序算法(5):归并排序

归并排序(Merge Sort)是一种基于分治思想的排序算法。它将待排序的数组分成两个长度相等的子数组,然后对这两个子数组分别进行归并排序,最后将两个排好序的子数组合并成一个有序的数组。

暗星涌动 3619

6-Halcon-- var_threshold 函数功能(用于基于局部统计特性的动态阈值分割的算子)

var_threshold 是 HALCON 中用于基于局部统计特性的动态阈值分割的算子,特别适用于处理低对比度图像或纹理均匀但包含细微差异的场景。与 dyn_threshold 不同,它不依赖预处理生成的参考图像,而是直接在局部区域内计算灰度值的统计特性(均值和标准差),从而自适应调整阈值。

weixin_45590420的博客 1327

Java实现排序算法之归并排序

一、综述      归并排序(Merge sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。     算法描述     归并操作的过程如下: 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列设定两个指针,最初位置分别为两个已经排序序列的起始位置比较两个

山中小僧的进阶之路 609

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

排序算法之归并排序 原理及java实现

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。 一、原理 可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现。 1.首先考虑“治”部分:如何将将二个有序数列合...

莫非d13 338

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

几大排序算法之归并排序(Java实现)

归并排序 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 1、归并操作(merge),也叫归并算法,指的是将两个顺序序列合并成一个顺序序列的方法: 设有数列{6,...

elinice 161

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

十大经典排序算法——归并排序 (Java、JavaScript、PHP、Python、Go语言实现

十大经典排序算法之——归并排序 本文主要介绍十大经典排序算法中的“归并排序”,并附上冒泡排序算法的Java、JavaScript、PHP、Python、Go语言实现。 1、十大经典排序算法介绍 排序算法可以分为内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。常见的内部排序算法有:插入排序、希尔排序、选择...

菜鸟的后花园 674

Java实现排序算法——归并排序

归并排序算法一个待排序的原始数据序列进行归并排序的基本思路是,首先将含有n个节点的待排序序列看作是有n个长度为1的有序表组成,将它们两两合并,得到长度为2的有序子列若干,然后在对这些子序列两两合并,得到长度为4的若干有序子列,重复上述过程,直到最后的子列长度为n,从而完成排序过程。代码实现如下:public class MergeSort { public static void main(S

小小本科生成长之路 704

如何在Java中实现高效的排序算法:从归并排序到堆排序

我们将深入理解这些算法的实现方式,并对它们的性能进行比较。堆排序的主要思想是将待排序的数组构建成一个最大堆或最小堆,然后通过不断提取堆顶元素来实现排序。堆排序的时间复杂度为O(n log n),它的优势在于不需要额外的存储空间。方法构建最大堆,然后将堆顶元素(最大值)与数组的最后一个元素交换,并重新堆化以维护堆的性质。堆排序的优点是它的空间复杂度为O(1),适合于对空间要求严格的应用场景。它将数组分成两个子数组,递归地对每个子数组进行排序,然后将两个已排序的子数组合并成一个排序好的数组。

微赚淘客系统开发者博客 321

排序算法java实现——归并排序

归并排序一、基本思路二、算法分析三、代码实现 一、基本思路 基本思路: 归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治策略。先将待排序列分成若干个子序列,使每个子序列有序,再将已有序的子序列合并,得到完全有序的序列。 简单来说: 就是将待排序列分成几部分每部分分别排序,再进行合并。 举例: 有一序列为:8, 4, 5, 7, 1, 3, 6, 2要求按升序排列 先进行划分:(按照对半划分:下标mid = (left + right) / 2) (1)(8,4,5,7),(1,3,6,2) (

猪奥奥的Blog 378

十大排序算法之归并排序--从理解原理到java代码实现

与快速排序的原地排序特性不同,归并排序需要额外的存储空间,但正是这种特性使其成为外部排序(处理大规模数据无法全部装入内存的情况)的首选算法。在合并过程中,通过比较两个子数组的元素,将较小的元素依次放入结果数组中,直到其中一个子数组的元素全部被处理完,然后将另一个子数组剩余的元素直接追加到结果数组的末尾。随后,我们将从最基础的递归实现入手,逐步深入到更高效的迭代实现,并探讨其在Java语言中的具体实现方式。,对这些子数组分别进行排序,然后再将排序好的子数组合并成一个有序的数组。分治思想是归并排序的核心。

gwndjsh的博客 380

描述几种常见的排序算法,如快速排序、归并排序、堆排序等。这些排序算法在Java中的实现方式。

每种排序算法都有其特点和适用场景。快速排序在平均情况下时间复杂度为O(n log n),但最坏情况下为O(n^2)。归并排序在所有情况下都能保证O(n log n)的时间复杂度,但需要额外的内存空间。堆排序的时间复杂度在最坏情况下也是O(n log n),且它不需要额外的内存空间,但可能比快速排序和归并排序慢一些,因为它涉及更多的数据交换。选择哪种排序算法取决于具体的应用需求和数据特性。

linzhongshu的专栏 642

排序算法之Java实现4——二路归并排序算法

归并排序算法,java实现,二路归并排序算法

sms0101的专栏 572

[排序算法] 归并排序的原理及其Java实现

你知道什么是归并排序算法吗?怎么实现这种排序?听说还有并行版的归并排序,怎么实现呢?本文将带你了解归并排序算法和其并行版的实现。

ToraNe的博客 388

排序算法之快速排序、归并排序(java实现)

前面一篇文章已经讲到了三个比较简单的排序算法,现在准备说一下比较高级一点的两个算法,他们在数据量比较大的时候的效果还是很明显的,我这里给出java的实现代码。 1.快速排序 过程:将待排序的第一个数作为标志temp,然后开始比较,i指向第一个数,j指向最后一个数,最开始j指向的数和temp比较,如果j比较大,j往左移动,否则i和j的数字交换,并且i开始想右边移动,知道i=j,完成一趟。一趟执行

CatterMCG 610

java多线程实现归并排序_排序算法Java实现(归并排序)

package sorting;/*** 归并排序* 平均O(nlogn),最好O(nlogn),最坏O(nlogn);空间复杂度O(n);稳定;较复杂* @author zeng**/public class MergeSort {public static void merge(int[] a, int start, int mid,int end) {int[] tmp = new int[...

weixin_29113833的博客 250
上一篇: 排序算法Java实现——选择排序(堆排序)
下一篇: 【数据结构】——-树和二叉树(一)
白衣染霜陈
博客等级 码龄22年 682粉丝 338原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值