排序算法图解(六):归并排序

news2024/11/26 4:33:27

文章目录

  • 1 归并排序简介
  • 2 思路简介及图解
  • 3 代码实现
  • 写在最后


1 归并排序简介

归并排序是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
归并排序是稳定排序,它也是一种十分高效的排序,能利用完全二叉树特性的排序一般性能都不会太差。java中Arrays.sort()采用了一种名为TimSort的排序算法,就是归并排序的优化版本。


2 思路简介及图解

以序列8、4、5、7、1、3、6、2为例
分而治之
在这里插入图片描述
可以看到这种结构很像一棵完全二叉树。分阶段可以理解为就是递归拆分子序列的过程,递归深度为log2n。

合并相邻有序子序列
在这里插入图片描述
在这里插入图片描述

从上文的图中可看出,每次合并操作的平均时间复杂度为O(n),而完全二叉树的深度为|log2n|。总的平均时间复杂度为O(nlogn)。而且,归并排序的最好,最坏,平均时间复杂度均为O(nlogn)。


3 代码实现

import java.util.Arrays;

/**
 * @author 兴趣使然黄小黄
 * @version 1.0
 * 递归实现归并排序
 */
@SuppressWarnings({"all"})
public class MergetSort {
    static int count = 0;

    public static void main(String[] args) {
        int[] arr = {8, 4, 5, 7, 1, 3, 6, 2};
        int[] temp = new int[arr.length];
        mergeSort(arr, 0, arr.length - 1, temp);
        System.out.println("归并排序后: arr[] = " + Arrays.toString(arr));
    }

    //归并排序
    public static void mergeSort(int[] arr, int left, int right, int[] temp){
        if (left < right){
            int mid = left - (left - right) / 2;
            //向左递归分解
            mergeSort(arr, left, mid, temp);
            //向右递归分解
            mergeSort(arr, mid + 1, right, temp);
            //排序 合并
            merge(arr, left, mid, right, temp);
        }
    }

    /**
     * 合并的方法
     * @param arr  排序的原始数组
     * @param left  左边有序序列的初始索引
     * @param mid  中间索引
     * @param right  右边索引
     * @param temp  中转数组
     */
    public static void merge(int[] arr, int left, int mid, int right, int[] temp){
        int i = left; //初始化i,左边有序序列的初始索引
        int j = mid + 1; //初始化j,右边有序序列的初始索引
        int t = 0; //指向temp数组的当前索引
        //先把左右两边有序数据按照规则填充到temp数组,直到左右两边有一边处理完毕
        while (i <= mid && j <= right){
            if (arr[i] <= arr[j]){
                temp[t] = arr[i];
                t++;
                i++;
            }else {
                temp[t] = arr[j];
                t++;
                j++;
            }
        }
        //把剩余的一方依次填充到temp数组
        while (i <= mid){ //左边序列还有剩余的元素
            temp[t++] = arr[i++];
        }
        while (j <= right){ //右边序列还有剩余的元素
            temp[t++] = arr[j++];
        }
        //将temp数组的元素拷贝到arr
        //拷贝每次小序列
        t = 0;
        int tempLeft = left;
        while (tempLeft <= right){
            arr[tempLeft++] = temp[t++];
        }
//        System.out.println("=====" + Arrays.toString(arr));
//        System.out.println(Arrays.toString(temp));
        count++;
        System.out.println("第" + count + "次合并: arr[] = " + Arrays.toString(arr));
//        System.out.println("第" + count + "次合并: temp[] = " + Arrays.toString(temp));
    }
}

实现结果如下:
在这里插入图片描述
这样看还是不好看出归并排序的过程,我们尝试把测试用例修改成{8, 7, 6, 5, 4, 3, 2, 1}:
在这里插入图片描述{8, 7, 6, 5, 4, 3, 2, 1}被拆分成了{8, 7}{6, 5}{4, 3}{2, 1}:

  • 第一次合并:{7, 8}有序
  • 第二次合并:{5, 6}有序
  • 第三次合并: {5, 6, 7, 8}有序
  • 第四次合并:{3, 4}有序
  • 第五次合并:{1, 2}有序
  • 第六次合并: {1, 2, 3, 4}有序
  • 第七次合并:{1,2,3,4,5,6,7,8}有序

写在最后

本文被 Java数据结构 收录点击订阅专栏 , 持续更新中。本文图片来自网络,仅供学习使用。
 创作不易,如果你有任何问题,欢迎私信,感谢您的支持!

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/27644.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

stm32cubemx hal学习记录:FreeRTOS软件定时器

一、配置过程 1、配置RCC、USART1、时钟84M 2、配置SYS&#xff0c;将Timebase Source修改为除滴答定时器外的其他定时器。 3、初始化LED的两个引脚、两个按键引脚 4、开启FreeRTOS&#xff0c;v1与v2版本不同&#xff0c;一般选用v1即可 5、打开定时器选项 6、创建两个定…

健身中心健身管理系统的设计与实现(源码+数据脚本+论文+技术文档)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

Mysql进阶学习(三)排序查询与常见函数

Mysql进阶学习&#xff08;三&#xff09;排序查询与常见函数一、进阶3&#xff1a;排序查询1、语法&#xff1a;2、特点&#xff1a;3、排序方式3.1、按单个字段排序3.2、添加筛选条件再排序案例&#xff1a;查询部门编号>90的员工信息&#xff0c;并按员工编号降序3.3、按…

基于SSM实现企业生资源管理系统-ERP系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

FlinkSql+Stream综合使用+广播流

Flink状态管理状态的分类Flink容错机制State Vs CheckPointCheckPoint原理State状态后端/State存储介质状态恢复和重启策略SavePointFlink TableAPI&SQL案例广播流状态管理 状态的分类 State ManagerState–开发中推荐使用&#xff1a;Flink自动管理/优化&#xff0c;支持多…

day 32 文件上传二次渲染.htaccess变异免杀

前言&#xff1a; #知识点&#xff1a; 1、文件上传-二次渲染 2、文件上传-简单免杀变异 3、文件上传-.htaccess妙用 4、文件上传-PHP语言特性 #详细点&#xff1a; 1、检测层面&#xff1a;前端&#xff0c;后端等 2、检测内容&#xff1a;文件头&#xff0c;完整性&am…

拥抱 Spring 全新 OAuth 解决方案

以下全文 Spring Authorization Server 简称为: SAS 背景 Spring 团队正式宣布 Spring Security OAuth 停止维护&#xff0c;该项目将不会再进行任何的迭代目前 Spring 生态中的 OAuth2 授权服务器是 Spring Authorization Server 已经可以正式生产使用 作为 SpringBoot 3.0 的…

设计文档编写要点

文章目录设计文档大致流程E-R关系图流程图UML图word制作目录设计文档大致流程 概要 表结构及其之间的关系&#xff08;E-R 图&#xff1a;实体-联系图 Entity Relationship Diagram&#xff09; 业务流程图、时序图&#xff08;按照人操作的维度&#xff09; 程序流程图、时序…

在X11图形环境下开启/关闭勿扰模式及其背后机制

开启/关闭勿扰模式 在Linux系统中、X11图形环境下&#xff0c;开启/关闭勿扰模式很简单&#xff0c;按照以下步骤操作即可&#xff1a; &#xff08;1&#xff09;鼠标左键点击右下角的“^”&#xff0c;即“显示隐藏的图标”。如下图所示&#xff1a; &#xff08;2&#xf…

退火算法研究分析

模拟退火算法采用类似于模拟退火的过程。先在一个高温状态下&#xff0c;逐渐退火&#xff0c;在每个温度下慢慢冷却&#xff0c;最终达到物理基态(相当于算法找到最优解&#xff09; 模拟退火算法属于贪心算法&#xff0c;在其过程中引入随机因素&#xff0c;以一定概率接收一…

Vue挂载(mount)和继承(extend)

vue.$mount 挂载 //index.html文件 <body><div id"app"></div> </body>//index.js文件 //1. 先看看普通的绑定 new Vue({el: #app,// el: document.getElementById(app) template: <div id"app">如果new Vue时候的option的…

【HTML5】弹性盒子实现导航栏和留言框

调CSS就像上方那样&#xff0c;代码逐渐变得扭曲&#xff0c;情绪逐渐变得暴躁。 目录 弹性盒子的核心属性 1、display设置元素生成框 2、弹性盒子比例划分 2.1flex-basis基本宽度 2.2flex-grow放大宽度 2.3flex-shrink缩小宽度 2.4单独的一个flex用法 3、flex-directi…

Windows安装配置Vagrant

1、下载 1.1、连接&#xff1a;https://developer.hashicorp.com/vagrant/downloads 1.2 、选择系统、版本、型号&#xff0c;然后下载 2、安装 2.1、双击运行下载的可执行文件&#xff0c;点击Next 2.2、先同意许可&#xff0c;然后点击Next 2.3、点击Change&#xff0c;选…

数理统计笔记2:总体均值的抽样分布

引言 数理统计笔记的第2篇总结了数理统计中样本均值的分布&#xff0c;可以帮助理解样本均值和总体均值分布之间的联系。举了一个例子可以加深理解&#xff0c;并且还补充了中心极限定理的知识。 一个关键的结论就此诞生了&#xff01;&#xff01;&#xff01; 样本均值的均值…

sqli-labs/Less-50

这一关仍然是以sort作为注入点的 首先我们输入rand() 判断是数字型还是字符型 多次尝试 发生变化 说明属于数字型 接着试试报错注入 输入以下语句 sortupdatexml(1,if(11,concat(0x7e,database(),0x7e),1),1)-- 存在回显 说明可以使用报错注入哦 这一关要训练的是堆叠注入…

Compression-Resistant Backdoor Attack against Deep Neural Networks 论文笔记

论文名称Compression-Resistant Backdoor Attack against Deep Neural Networks作者Mingfu Xue&#xff08;南京航空航天大学&#xff09;会议/出版社未发表pdf&#x1f4c4;在线pdf代码无概要本文提出了一种对图像压缩&#xff08;JPEG&#xff0c;JPEG2000&#xff0c;WEBP&a…

Linux进阶-文件

Linux内核&#xff1a;屏蔽硬件区别&#xff0c;把所有的硬件设备抽象成文件&#xff0c;提供统一的接口给用户使用。 目录 虚拟文件系统&#xff1a;抽象层&#xff0c;对文件的访问实际上是对抽象层的访问。 普通文件系统&#xff1a;ext4、fat32、ubifs 特殊文件系统 文…

java 数据脱敏

1.SQL数据脱敏实现 MYSQL(电话号码,身份证)数据脱敏的实现 -- CONCAT()、LEFT()和RIGHT()字符串函数组合使用&#xff0c;请看下面具体实现-- CONCAT(str1,str2,…)&#xff1a;返回结果为连接参数产生的字符串 -- LEFT(str,len)&#xff1a;返回从字符串str 开始的len 最左字…

NestJS学习:搭建项目、依赖注入、常用命令、RESTful 风格设计

介绍 Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。它利用 JavaScript 的渐进增强的能力&#xff0c;使用并完全支持 TypeScript &#xff08;仍然允许开发者使用纯 JavaScript 进行开发&#xff09;&#xff0c;并结合了 OOP &#xff0…

现代密码学导论-4-完美保密及其三个等价定义

目录 完美保密 Perfectly Secret Encryption 2.1 完美保密的定义 DEFINITION 2.3 完美保密加密方案的定义 LEMMA 2.5 完美保密方案的等价定义(一) 证明引理2.5与定义2.3等价 完美不可区分性 不可区分实验 The adversarial indistinguishability experiment DEFINITION …