Java常用排序算法之合并排序

Java中常用排序算法及示例-冒泡排序、希尔排序、选择排序、插入排序、合并排序、基数排序、快速排序、堆积树排序 Java中需要对数据进行排序处理,常用的排序算法以及示例进行归纳整理。 阅读详情

合并排序(merge sort):是建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用。合并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。合并排序也叫归并排序。
在网上看了好多有关合并排序的博客和代码,博客大多讲的不是很容易理解,代码很多都是有问题的,也发现一篇讲的很好的,也比较容易理解。
参考链接:http://www.cnblogs.com/yangecnu/p/Introduce-Merge-Sort.html
偷懒直接用了合并排序百度百科里面的代码。亲测为真
具体过程:
1.利用递归,不断二分将原始数组分成n个长度为1的子表,每个子表只有一个数据,认为其是有序的。
2.将这n个有序子表两两合并,这里将相邻的子表两两合并,合并后分别排序。
3.将上面得到的长度为2的有序表进行两两合并,并排序。
4.将上面得到的长度为4的有序表进行两两合并,并排序。
。。。
可以用下图演示
这里写图片描述

原理就是先分后合,下面这个动图非常清晰的演示了整个过程
这里写图片描述

代码实现:

import java.util.Arrays;

public class MergeSort {
    static final int SIZE = 15;//将数组长度定义为常量
    public static void mergeSort(int[] array) {
        int length = array.length;//获取数组长度
        int middle = length / 2;//取数组中间下标值
        if (length > 1) {//循环递归直到数组分割最小化
            // 拷贝数组array的左、右半部分
            int[] left = Arrays.copyOfRange(array, 0, middle);
            int[] right = Arrays.copyOfRange(array, middle, length);
            mergeSort(left);// 递归array的左半部分
            mergeSort(right);// 递归array的右半部分
            merge(array, left, right);// 数组左半部分、右半部分合并排序至数组Array
        }
    }
    // 合并数组,定义左、右半数组和最后合并后数组
    private static void merge(int[] result, int[] left, int[] right) {

        int i = 0, l = 0, r = 0;

        while (l < left.length && r < right.length) {

            if (left[l] < right[r]) {
                result[i] = left[l];
                i++;
                l++;
            } else {
                result[i] = right[r];
                i++;
                r++;
            }
        }
        // 如果右边剩下则将右边剩下的部分合并至数组result
        while (r < right.length) {
            result[i] = right[r];
            r++;
            i++;
        }
        // 如果左边剩下则将左边剩下的部分合并至数组result
        while (l < left.length) {
            result[i] = left[l];
            l++;
            i++;
        }
    }

    public static void main(String[] args) {
        int arr[] = new int[SIZE];//随机产生一个数组
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) (Math.random() * 100);
        }
        System.out.println("排序前的数组:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
        mergeSort(arr);
        System.out.println("合并排序后的数组:");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}

输出:

排序前的数组:
11 53 10 34 0 26 93 1 75 53 26 14 56 39 72 
合并排序后的数组:
0 1 10 11 14 26 26 34 39 53 53 56 72 75 93 
基于MATLAB实现的克里金插值的代码 参考代码 克里金插值matlab代码 youwenfan.com/contentcsb/81657.html。 阅读详情

相关推荐

BioEmu:微软黑科技炸场!生成式AI重构蛋白质模拟:千倍效率碾压传统计算,新药研发周期砍半

BioEmu 是微软推出的生成式深度学习系统,可在单个 GPU 上每小时生成数千种蛋白质结构样本,支持模拟动态变化、预测热力学性质,并显著降低计算成本。

士多啤梨先生の博客 1100

合并两个无序数组java_88. 合并两个有序数组

88. 合并两个有序数组给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。说明:初始化 nums1 和 nums2的元素数量分别为 m 和 n 。 你可以假设 nums1有足够的空间(空间大小大于或等于m + n)来保存 nums2中的元素。示例:输入: nums1 = [1,2,3,0,0,0], m = 3 nums...

weixin_39831705的博客 368

竞拍算法(Auction Algorithm)原理及工作过程分析

因一些项目工作需要对竞拍算法进行深入了解。但百度了大部分资料都未找到一篇文章能对此算法进行较为深入的介绍。在一番努力之下,终于找打了最初提出该算法的论文,本文内容主要结合该论文对竞拍算法进行分析。 竞拍算法简介 竞拍算法(Auction Algorithm)是一种用于解决分配问题的分布式算法,经相关文献查询,最早由麻省理工学院信息和决策系统实验室的Bertsekas(教授?)提出 1,于1988年发表于期刊Annals of Operations Research。 顾名思义,竞拍算法本质就是模拟人类拍.

weixin_47546390的博客 3万+

Java-合并两个有序数组

输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3。合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。输入:nums1 = [0], m = 0, nums2 = [1], n = 1。输入:nums1 = [1], m = 1, nums2 = [], n = 0。解释:需要合并 [1,2,3] 和 [2,5,6]。解释:需要合并的数组是 [] 和 [1]。输出:[1,2,2,3,5,6]

weixin_60588588的博客 446

人工智能入门系列之一: 鸢尾花(Iris)多分类的神经网络详解及代码实现

这是最好的时代,我们一起来打造属于自动驾驶汽车上路、无人机飞天、智能机器人管工厂的AI未来 人工智能领域分化为两个阵营:其一是规则式(rule-based)方法,在人工智能早期占主峰;其二是神经网络(neural network)方法,后起之秀。随着硬件水平的提高,算力的指数式增长;人工智能的重心已经从规则式的专家时代转移到神经网络的数据时代。 “神经网络”不选择把人脑熟稔的逻辑规则传授给计算机...

NLP家的码奴小荷的博客 2万+

【亲测】ubuntu20.4 安装CUDA11.8

一步一步搭建C++ CUDA CUDNN TENSORRT OPENCV DNN ONNXRUNTIME推理环境

weixin_40950590的博客 3896

Java 归并排序

归并排序,有递归实现与迭代实现两种方式,这里给出递归实现的方案。 归并排序的含义是把两个有序的序列合并成一个有序的序列。 具体做法更简单:(这里假设两个有序序列均是从小到大排列的) 首先是创建一个空序列,长度为 这两个序列的长度之和; 然后是从前向后遍历这两个序列的值,取出每次比较的较小值存放进这个新序列中,然后一直往后更新索引值,直到其中一个序列的全部元素放入到新序列中; 然后把另一个序列中剩余的值,直接全部添加到这个新的序列的末尾 经过上面3步,就完成了归并排序。 而如果当前是一个无序的队列,怎

Cat的专栏 1336

SGLang HiCache实战:手把手教你配置KV Cache Offload,让大模型推理成本直降84%

本文详细介绍了SGLang HiCache在KV Cache Offload配置与调优中的实战应用,通过多级存储架构和智能卸载策略,显著降低大模型推理成本达84%。文章涵盖HiCache架构优势、环境配置、高级调优策略及生产环境最佳实践,帮助开发者优化GPU显存使用,提升并发处理能力。

weixin_29044713的博客 463

python找不到reshape_python – AttributeError:’Tensor’对象没有属性’reshape’

我想写一个去噪自动编码器,为了可视化的目的,我想打印出损坏的图像.这是我想要显示损坏图像的测试部分:def corrupt(x):noise = tf.random_normal(shape=tf.shape(x), mean=0.0, stddev=0.2, dtype=tf.float32)return x + noise# Testing# Encode and decode images ...

weixin_39880621的博客 521

从CD4051到现代模拟开关:40年芯片演进史与选型避坑指南

本文回顾了从CD4051到现代模拟开关的40年技术演进,详细对比了导通电阻、带宽等关键参数的显著提升。通过实际案例和选型矩阵,揭示现代模拟开关在精度、功耗和集成度方面的优势,并提供高精度测量、电池供电等场景的选型策略与避坑指南,帮助工程师优化设计。

weixin_42543046的博客 154

MATLAB算法实战应用案例精讲-【数模应用】校准曲线(附MATLAB、python和R语言代码实现)

模型校准曲线(Calibration Curve),也称为可靠性曲线(Reliability Curve)或概率校准曲线(Probability Calibration Curve),是一种评估分类模型输出概率准确性的图形工具。它可以帮助我们理解模型的预测概率是否与实际标签的分布一致。校准曲线通常包括以下步骤:计算模型预测概率:对于测试集中的每个样本,模型会输出一个概率值,表示样本属于正类的概率。将数据分桶:将这些概率值分成若干个等宽的桶(例如10个桶),每个桶中的样本具有相似的预测概率。

qq_36130719的博客 559

合并两个无序数组java_java 合并两个有序数组

package base;/*** java 合并两个有序数组*/public class MergeTwoArray {public static void main(String[] args) {int[] arrayA = {100,200,201,334};int[] arrayB = {101,104,106,233,455,772};int[] arrayC = new int[ar...

weixin_39603357的博客 297

YOLOv13改进策略【Neck】| GSConv+Slim Neck:混合深度可分离卷积和标准卷积的轻量化网络设计

实时检测器架构的轻量级设计GsConv。

Limiiiing的博客 91

java常用的7大排序算法汇总

这段时间闲了下来,就抽了点时间总结了下java中常用的七大排序算法,希望以后可以回顾!

文艺范Coder的博客,5星好评哦亲~ 1655

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

java 流行排序_Java中常用的七大排序算法

原标题:Java中常用的七大排序算法Java作为时下最流行的编程语言,自流行开始就没有衰落过,作为一门永远不过时的语言是可怕的,小编总结了一些关于Java常用的排序算法,希望对大家的Java学习有所帮助。 1.插入排序算法插入排序的基本思想是在遍历数组的过程中,假设在序号 i 之前的元素即 [0..i-1] 都已经排好序,本趟需要找到 i 对应的元素 x 的正确位置 k ,并且在寻找这个位置 k ...

weixin_32371243的博客 136

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

java 流行排序_java常用的排序算法你知道哪些

如果是想学习Android的开发,那么java编程那是走不掉的了,学习编程无非是首先是要掌握变量、数组等基本的知识,编程它涉及到的知识点是比较多的,因此在学习路途中需要走好每一步的,本文将为大家带来的是java常用的排序算法,有需要的朋友可以参考一下。1.选择排序算法使用选择排序的基本思想是遍历数组的过程中,它是以i代表当前需要排序的序号,则需要在剩余的[i…n-1]中找出其中的一个 小值,然后将...

weixin_29831325的博客 134

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

合并排序与快速排序算法

常见排序算法:合并排序与快速排序

weixin_49588575的博客 1098

一个面试官经常问到的题,将两个数组合并到一个数组中,并排序。

我也是初学者,随便写了一下,没想到可以运行成功。 package zhoumo.java.simple; import java.util.Arrays; public class Simple { public static void main(String[] args) { try { int []a ={23,54,34,89,21,43,5

JAVA领域优质创作者,基于分片网络查询方法专利发明者。 1904

Java常用的7大排序算法汇总

转载:原文地址:http://mp.weixin.qq.com/s?__biz=MjM5MDI5MjAyMA==&mid=400489561&idx=2&sn=7f6d76bc1e6aee46d88a078d77805b33&scene=23&srcid=1120hV85iVy8oxk2sqqCoXvf#rd 这段时间闲了下来,就抽了点时间总结了下java中常用的七大排序算法,希

Spring cloud 超时汇总 498

java实现12种排序算法

Java实现的12种排序 2019-01-05 一.冒泡排序及其实现 二.希尔排序及其实现 三.插入排序及其实现 四.插入排序及其实现 五.快速排序及其实现 六.合并排序及其实现 七.计数排序及其实现 八.基数排序及其实现 九. 桶排序及其实现 十. 堆排序及其实现 十一.二叉树排序及有序集合 十二.利用集合的4种排序...

weixin_34392843的博客 320

Java学习记录 Day11(StringBuffer、排序算法)

Day 11 2019年4月27日。 这是我来到西部开源的第十一天。 这一天,我学到了以下的知识。 StringBuffer类 StringBuffer,是一个长度可变的字节容器,可以存储多个字符,也可以不断的往容器中追加内容。 构造方法:public StringBuffer() // 无参构造方法 **public StringBuffer(int capacity) // 指定容量的字符串缓...

赈川 361

Java常用算法原理剖析

用Java实现的所有算法(用于教育)这些只是为了演示的目的。在Java标准库中有许多不同类型的实现,由于性能原因这些要好得多。排序算法气泡从维基百科气泡排序,叫做下沉排序,是一种简单的排序算法,反复遍历要排序的列表,比较每一对相邻的项目,并在排序错误的情况下交换。遍历列表将被重复,直到不需要交换,这表明列表已被排序。特性最差情况下的性能O(n^2)最佳案例表现O(N)平均病例性能O(n^2)查看算...

Java_fenxiang的博客 438

Java中常用算法

Java常用算法 1.插入排序算法 插入排序的基本思想是在遍历数组的过程中,假设在序号 i 之前的元素即 [0…i-1] 都已经排好序,本趟需要找到 i 对应的元素 x 的正确位置 k ,并且在寻找这个位置 k 的过程中逐个将比较过的元素往后移一位,为元素 x “腾位置”,最后将 k 对应的元素值赋为 x ,一般情况下,插入排序的时间复杂度和空间复杂度分别为 O(n2 ) 和 O(1)。 /** ...

weixin_43545025的博客 514

Java选择排序算法

Java常用排序算法,包括交换排序、选择排序、插入排序和合并排序。其中交换排序主要包括冒泡排序和快速排序法;选择排序主要包括选择排序法和堆排序法;插入排序主要包含插入排序法和Shell排序法。以上几种基本排序法直接对计算机内存中的数据进行排序。 冒泡排序算法通过多次比较和交换实现排序,其排序流程如下: (1)对数组中的各数据,依次比较相邻两元素的大小。 (2)如果前面的数据大于后面的数据,就交换两个

linliang的博客 428

常用排序算法之归并排序

归并排序,核心为数组分解和合并的过程。将数组逐渐分解,直到两个两个元素为一组,待小组排序完成后,再将两个两个小组合并为一个一个有序的大组……最后得到排序后的原始数组。         代码实现:         public class MergingSort { /** * MethodName:main * Description:常用排序算法之归并排序 * @para

Sunny_Shu123的博客 335
上一篇: Java常用排序算法之堆排序
下一篇: Eclipse 代码修改后仍然是之前的运行结果解决办法
詹詹自喜KING
博客等级 码龄11年 40粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值