数据结构与算法之排序算法-归并排序
排序算法是数据结构与算法中最基本的算法之一,其作用就是将一些可以比较大小的数据进行有规律的排序,而想要实现这种排序就拥有很多种方法~
那么我将通过几篇文章,将排序算法中各种算法细化的,详尽的为大家呈现出来:
📚 非线性时间比较类:
📕 插入类排序:数据结构与算法之排序算法-插入排序-CSDN博客
📖 直接插入排序
📖 希尔排序
📕 交换类排序:数据结构与算法之排序算法-快速排序(分治)-CSDN博客
📖 冒泡排序
📖 冒泡排序-优化
📖 快速排序(Hoare,挖坑法,前后指针法)
📖 快速排序-优化
📕 选择类排序:数据结构与算法之排序算法-选择排序-CSDN博客
📖 简单选择排序
📖 堆排序
📕 归并类排序:[本篇]
📖 归并排序
📚 线性时间非比较类:
📕 非比较类排序:数据结构与算法之排序算法-(计数,桶,基数排序)-CSDN博客
📖 计数排序
📖 桶排序
📖 基数排序
一、归并排序
稳定性:稳定
时间复杂度:O(n logn)
额外空间复杂度:O(n)
归并排序也是一种在实际应用中比较常用的排序算法,这是因为它的速度和快速排序一样也是O(n logn),并且相较于快速排序,归并排序还具有稳定性
但唯一的缺点就是归并排序并不是"原地算法",而是需要开辟一个和原数组一样大小的辅助数组,所以归并排序的额外空间复杂度为O(n)
① 习题引入:合并排序的数组
首先,为什么要使用这题作为习题引入呢?我们先接着上面的话题,研究研究归并排序:
上面我们提到归并排序的时间复杂度为O(n logn),从这里就不难猜出,归并排序的算法大概也是和快排类似,是一种"不断将数组分为两份"的排序算法,也就是"分治"
归并排序的基本思想:取数组的开始位置为left,结束位置为right,不断对数组取中间下标mid,使数组均匀的被分成两个新数组,并继续对新数组进行如上操作。
直到left == right(数组中只有一个元素)时,我们认为此时这个数组为有序数组,将它向上递归。按照这个思想,我们后续递归回去的数组也都是有序的,而如此便能够提到我们上面说的这道习题了:"合并排序的数组"
📚 思路提示:
合并有序的数组想必对大家来说肯定非常简单的~毕竟我们之前在学习"链表"的时候就实现过类似的题目,而"合并有序链表"应该是比"合并有序数组"要更加复杂一点点的。
我们只需要创建一个新的数组 arr ,使他的长度等于两个数组之和,然后遍历两个数组,使用双指针的思想,用cur1遍历 arr1,用cur2遍历arr2,将较小的元素放入arr中,随后移动cur1/cur2。
(最后可能会有一个数组没被加入完,记得处理一下就好)
📖 代码示例:
class Solution {public void merge(int[] A, int m, int[] B, int n) {int[] nums = new int[m + n];int cur1 = 0;int cur2 = 0;int i = 0;while(cur1 < m && cur2 < n){nums[i++] = A[cur1] < B[cur2] ? A[cur1++] : B[cur2++];}while(cur1 < m) nums[i++] = A[cur1++];while(cur2 < n) nums[i++] = B[cur2++];for(i = 0;i < n + m;i++){A[i] = nums[i];}}
}
② 归并排序
而上面我们又提到了,将有序的数组向上递归,排序后再递归,这样多此递归下来,我们就能够得到我们想要的"有序数组"。
这样就正好验证了,归并排序的排序速度与其中数组的有序性并没有关系,也就是说它是稳定的O(n logn)的排序~
⭐ 图示:
📖 代码示例:
public static int[] arr;public int[] sortArray(int[] nums) {arr = new int[nums.length];mergeSort(nums, 0, nums.length - 1);return nums;}public static void mergeSort(int[] array, int left, int right) {if (left >= right) {return;}int mid = left + (right - left) / 2;mergeSort(array, left, mid);mergeSort(array, mid + 1, right);int cur1 = left;int cur2 = mid + 1;int i = 0;while (cur1 <= mid && cur2 <= right) {arr[i++] = array[cur1] < array[cur2] ? array[cur1++] : array[cur2++];}while (cur1 <= mid) {arr[i++] = array[cur1++];}while (cur2 <= right) {arr[i++] = array[cur2++];}for (i = left; i <= right; i++) {array[i] = arr[i - left];}}
那么上次我们学习的"快速排序优化版"能跑多少ms呢?能跑到 30多ms~:
而归并排序跑了 28ms,再一次证明了它O(n logn)的速度是多么的稳定(内存消耗的多就是了)。
那么这篇关于归并排序的文章到这里就结束啦,作者能力有限,如果有哪里说的不够清楚或者不够准确,还请各位在评论区多多指出,我也会虚心学习的,我们下次再见啦
相关文章:

数据结构与算法之排序算法-归并排序
排序算法是数据结构与算法中最基本的算法之一,其作用就是将一些可以比较大小的数据进行有规律的排序,而想要实现这种排序就拥有很多种方法~ 那么我将通过几篇文章,将排序算法中各种算法细化的,详尽的为大家呈现出来: …...

高血压危险因素分析(项目分享)
高血压危险因素分析(项目分享) 高血压作为一种极为常见的慢性疾病,正严重威胁着大众健康。它的发病机制较为复杂,涉及多个方面的因素。 在一份临床采集的数据的基础上,我们通过数据分析手段深入观察一下 BMI…...

java集合框架之Map系列
前言 首先从最常用的HashMap开始。HashMap是基于哈希表实现的,使用数组和链表(或红黑树)的结构。在Java 8之后,当链表长度超过阈值时会转换为红黑树,以提高查询效率。哈希冲突通过链地址法解决。需要明确的是ÿ…...
android设置添加设备QR码信息
摘要:客户衍生需求,通过扫QR码快速获取设备基础信息,并且基于POS SDK进行打印。 1. 定位至device info的xml添加相关perference Index: vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/my_device_info.xml--- vendor/medi…...

Python实现微博关键词爬虫
1.背景介绍 随着社交媒体的广泛应用,微博上的海量数据成为了很多研究和分析的重要信息源。为了方便获取微博的相关内容,本文将介绍如何使用Python编写一个简单的爬虫脚本,从微博中抓取指定关键词的相关数据,并将这些数据保存为Ex…...
linux概念详解
用户守护进程 用户空间守护进程是一些在后台运行的长期服务程序,提供系统级服务。 下面举一些例子。 网络服务: 如sshd(SSH服务)、httpd(HTTP服务)。 sshd:sshd 守护进程会在后台运行&#x…...

【设计模式】-工厂模式(简单工厂、工厂方法、抽象工厂)
工厂模式(简单工厂、工厂方法、抽象工厂) 介绍 简单工厂模式 简单工厂模式不属于23种GoF设计模式之一,但它是一种常见的设计模式。它提供了一种创建对象的接口,但由子类决定要实例化的类是哪一个。这样,工厂方法模式让类的实例化推迟到子类…...

AMESim中批处理功能的应用
AMESim 软件的批处理功能是一项能显著提高仿真效率和灵活性的功能,以下是其介绍与应用说明: 一 功能介绍 参数扫描功能:用户可以指定模型中一个或多个参数的取值范围和步长,批处理功能会自动遍历这些参数组合,进行多…...

《Spring实战》(第6版)第1章 Spring起步
第1部分 Spring基础 第1章 Spring起步 1.1 什么是Spring Spring的核心是提供一个容器(container)。 称为Spring应用上下文(Spring application context)。 创建和管理应用的组件(bean),与上下文装配在一起。 Bean装配通过依赖注入(Dependency Injection,DI)。…...
E卷-特殊的加密算法-(200分)
专栏订阅🔗 特殊的加密算法 问题描述 有一种特殊的加密算法,明文为一段数字串,经过密码本查找转换,生成另一段密文数字串。规则如下: 明文为一段由 0-9 组成的数字串。密码本为由数字 0-9 组成的二维数组。需要按明文串的数字顺序在密码本里找到同样的数字串,密码本里…...

QT 异步编程之多线程
一、概述 1、在进行桌面应用程序开发的时候,假设应用程序在某些情况下需要处理比较复制的逻辑,如果只有一个线程去处理,就会导致窗口卡顿,无法处理用户的相关操作。这种情况下就需要使用多线程,其中一个线程处理窗口事…...
K-均值(K-means)
K-均值(K-means)是一种常用的无监督学习算法,用于将数据集中的样本分成 K 个簇。该算法的过程大致如下: 1. 随机初始化 K 个聚类中心(centroid)。 2. 将每个样本分配到与其最近的聚类中心所代表的簇。 3. …...
AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐
AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐 目录 AI agent 未来好的趋势:AI医疗影像、智能客服、个性化推荐比特币AI Agents稳定币扩容区块链AI基础设施AI驱动的软件应用AI赋能的行业应用AI医疗影像、智能客服、个性化推荐AI药物研发比特币 市场与机构化:2024…...

接入 SSL 认证配置:满足等保最佳实践
前言 随着信息安全形势的日益严峻,等保(信息安全等级保护)要求成为各行业信息系统必须遵守的标准。在数据库领域,OpenGauss作为一款高性能、安全、可靠的开源关系型数据库,也需要满足等保要求,确保数据的安…...

微软AutoGen高级功能——Selector Group Chat
介绍 大家好,这次给大家分享的内容是微软AutoGen框架的高级功能Selector Group Chat(选择器群聊),"选择器群聊"我在给大家分享的这篇博文的代码中有所体现微软AutoGen介绍——Custom Agents创建自己的Agents-CSDN博客,但是并没有详…...

w206基于Spring Boot的农商对接系统的设计与实现
🙊作者简介:多年一线开发工作经验,原创团队,分享技术代码帮助学生学习,独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取,记得注明来意哦~🌹赠送计算机毕业设计600个选题excel文…...

Springboot中使用Elasticsearch(部署+使用+讲解 最完整)
目录 引言 一、docker中安装Elasticsearch 1、创建es专有的网络 2、开放端口 3、在es-net网络上安装es和kibana 4、可能出现的问题 5、测试 6、安装IK分词器 7、测试IK分词器 二、结合业务实战 1、准备依赖 2、配置yml 3、读取yml配置 4、准备es配置类 5、编写测…...

深度求索—DeepSeek API的简单调用(Java)
DeepSeek简介 DeepSeek(深度求索)是由中国人工智能公司深度求索(DeepSeek Inc.)研发的大规模语言模型(LLM),专注于提供高效、智能的自然语言处理能力,支持多种场景下的文本生成、对…...
flv实时监控视频
文章目录 前言一、安装二、引入三、使用 前言 开发大屏项目时,可能需要在大屏上展示一个监控画面,此时就可以用的flv.js来展示视频效果 一、安装 npm install flv.js二、引入 import flvjs from flv.js;三、使用 <video ref"videoElement&quo…...

有哪些免费的SEO软件优化工具
随着2025年互联网的不断发展,越来越多的企业意识到在数字营销中,网站的曝光度和排名至关重要。无论是想要提高品牌知名度,还是想要通过在线销售增加收益,SEO(搜索引擎优化)都是一项不可忽视的关键策略。而要…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...

实战设计模式之模板方法模式
概述 模板方法模式定义了一个操作中的算法骨架,并将某些步骤延迟到子类中实现。模板方法使得子类可以在不改变算法结构的前提下,重新定义算法中的某些步骤。简单来说,就是在一个方法中定义了要执行的步骤顺序或算法框架,但允许子类…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...
Android屏幕刷新率与FPS(Frames Per Second) 120hz
Android屏幕刷新率与FPS(Frames Per Second) 120hz 屏幕刷新率是屏幕每秒钟刷新显示内容的次数,单位是赫兹(Hz)。 60Hz 屏幕:每秒刷新 60 次,每次刷新间隔约 16.67ms 90Hz 屏幕:每秒刷新 90 次,…...
当下AI智能硬件方案浅谈
背景: 现在大模型出来以后,打破了常规的机械式的对话,人机对话变得更聪明一点。 对话用到的技术主要是实时音视频,简称为RTC。下游硬件厂商一般都不会去自己开发音视频技术,开发自己的大模型。商用方案多见为字节、百…...
Shell 解释器 bash 和 dash 区别
bash 和 dash 都是 Unix/Linux 系统中的 Shell 解释器,但它们在功能、语法和性能上有显著区别。以下是它们的详细对比: 1. 基本区别 特性bash (Bourne-Again SHell)dash (Debian Almquist SHell)来源G…...

华硕电脑,全新的超频方式,无需进入BIOS
想要追求更佳性能释放 或探索更多可玩性的小伙伴, 可能会需要为你的电脑超频。 但我们常用的不论是BIOS里的超频, 还是Armoury Crate奥创智控中心超频, 每次调节都要重启,有点麻烦。 TurboV Core 全新的超频方案来了 4不规…...