当前位置: 首页 > news >正文

排序进行曲-v3.0

文章目录

  • 小程一言
    • 归并排序
      • 步骤
      • 举例
        • 总结
        • 时间复杂度分析:
        • 空间复杂度分析:
        • 注意
      • 应用场景
        • 总结
      • 实际举例
          • Other
      • 代码实现
        • 结果
        • 解释

小程一言

这篇文章是在排序进行曲2.0之后的续讲,
这篇文章主要是对归并排序进行细致分析,以及操作。
希望大家多多支持

图片: Alt

归并排序

归并排序是一种分治算法,它将一个待排序的数组分成两个子数组,分别对这两个子数组进行排序,然后再将
两个有序的子数组合并为一个有序的数组。这个过程不断地递归进行,直到最后将整个数组排序完成。

步骤

分割(Divide):将待排序的数组不断地二分,直到分成单个元素的子数组。这个过程可以通过递归实现。递归的终止条件是数组的长度为1。合并(Merge):将相邻的两个有序子数组合并为一个有序的子数组。合并的方法是比较两个子数组的第一个元素,将较小的元素放在新的子数组中,并将该元素从原子数组中移除。然后继续比较两个子数组的新的第一个元素,重复这个过程,直到其中一个子数组为空。将剩余的另一个子数组直接拼接到新的子数组的末尾。递归合并(Recursive Merge):对每个单个元素的子数组进行排序和合并。当子数组长度为1时,它已经是有序的,直接返回该子数组即可。对于长度大于1的子数组,先将其分割成两个子数组,然后分别对这两个子数组进行递归合并,得到两个有序的子数组。最后将这两个有序的子数组进行合并,得到一个更大的有序子数组。

举例

假设我们要对数组 [5, 3, 8, 2, 9, 1] 进行排序。分割(Divide):首先将数组分成两个子数组,即 [5, 3, 8] 和 [2, 9, 1]。递归合并(Recursive Merge):对两个子数组分别进行递归合并排序。首先对 [5, 3, 8] 进行递归合并排序,得到有序子数组 [3, 5, 8]。然后对 [2, 9, 1] 进行递归合并排序,得到有序子数组 [1, 2, 9]。合并(Merge):将两个有序子数组 [3, 5, 8] 和 [1, 2, 9] 进行合并。比较两个子数组的第一个元素,将较小的元素放入新的子数组中,并将该元素从原子数组中移除。依次比较,得到新的子数组[1, 2, 3, 5, 8, 9]。最终,整个数组 [5, 3, 8, 2, 9, 1] 经过归并排序后,得到有序数组 [1, 2, 3, 5, 8, 9]。

总结

这个例子展示了归并排序的过程,通过不断地分割和合并子数组,最终将整个数组排序。在每一次合并过程中,我们都是将两个有序的子数组合并为一个有序的子数组,这保证了最终得到的整个数组是有序的。

图片: ![Alt](https://img-home.csdnimg.cn/images/20220524100510.png
)### 复杂度分析

归并排序的时间复杂度为 O(nlogn),空间复杂度为 O(n)。

时间复杂度分析:


分割(Divide):每次将数组分割成两个子数组,分割的时间复杂度为 O(logn)。因为每次分割都将数组的大小减半,所以需要进行 logn 次分割。
合并(Merge):对于每一次合并操作,需要比较两个子数组的元素并将较小的元素放入新的子数组中,合并的时间复杂度为 O(n)。因为每次合并都是将两个子数组的元素全部比较一遍,所以需要进行 n 次合并。
递归合并(Recursive Merge):对于长度为 n 的数组,需要进行 logn 次递归合并,每次递归合并的时间复杂度为 O(n)。所以总的时间复杂度为 O(nlogn)。

空间复杂度分析:

在每次递归合并的过程中,需要创建临时数组来存储合并后的子数组,临时数组的空间复杂度为 O(n)。
在每次递归合并完成后,临时数组会被销毁,所以整个归并排序的空间复杂度为 O(n)。

注意

归并排序是一种稳定的排序算法,因为在合并的过程中,如果两个元素相等,我们会先将左边的元素放入新的子数组中,这样可以保持原始数组中相等元素的相对顺序不变。

应用场景

排序问题:归并排序可以用于对数组、链表等数据结构进行排序。它的时间复杂度为O(nlogn),在处理大规模数据集时表现较好。大规模数据的排序:归并排序适用于需要对大规模数据进行排序的场景。由于归并排序是一种分治算法,可以将大规模数据分割成较小的子问题进行排序,然后再将排序好的子问题合并起来。外部排序:归并排序是一种适用于外部排序的算法。外部排序是指需要处理的数据量大于计算机内存容量,需要将数据存储在外部存储介质(如硬盘)中进行排序。归并排序的特点是每次只需要读取一部分数据到内存中进行排序,然后将排序好的数据写回外部存储介质。并行计算:归并排序可以通过并行计算的方式提高排序的效率。由于归并排序的分治特性,可以将大规模数据分割成多个子问题进行排序,然后再将排序好的子问题合并起来。这种并行计算的方式可以利用多核处理器或分布式计算环境来加速排序过程。

在这里插入图片描述

总结

归并排序适用于排序问题,特别是大规模数据的排序和外部排序场景。它具有稳定的时间复杂度和较好的并行性能,因此在实际应用中被广泛使用。

实际举例

数组排序:归并排序可以用于对数组进行排序。例如,给定一个整数数组,可以使用归并排序将数组中的元素按照升序进行排序。链表排序:归并排序也可以用于对链表进行排序。例如,给定一个链表,可以使用归并排序将链表中的节点按照升序进行排序。文件排序:归并排序可以用于对大规模文件进行排序。例如,当需要对一个非常大的文件进行排序时,可以使用归并排序算法将文件分割成多个较小的部分,分别对这些部分进行排序,然后再将排序好的部分合并起来。数据库排序:归并排序可以用于对数据库中的数据进行排序。例如,在某个数据库表中有大量的数据需要按照某个字段进行排序,可以使用归并排序算法将数据分割成多个较小的部分,分别对这些部分进行排序,然后再将排序好的部分合并起来。外部排序:归并排序是一种适用于外部排序的算法。外部排序是指需要处理的数据量大于计算机内存容量,需要将数据存储在外部存储介质(如硬盘)中进行排序。归并排序的特点是每次只需要读取一部分数据到内存中进行排序,然后将排序好的数据写回外部存储介质。

在这里插入图片描述

Other
这些例子只是归并排序在实际中的一些应用,实际上归并排序的思想和方法也可以应用于其他问题,只需要将问题分割成更小的子问题,并将子问题的结果合并起来。

代码实现

public class MergeSort {public static void mergeSort(int[] arr) {if (arr == null || arr.length <= 1) {return;}int[] temp = new int[arr.length];mergeSort(arr, 0, arr.length - 1, temp);}private static void mergeSort(int[] arr, int start, int end, int[] temp) {if (start >= end) {return;}int mid = start + (end - start) / 2;mergeSort(arr, start, mid, temp);mergeSort(arr, mid + 1, end, temp);merge(arr, start, mid, end, temp);}private static void merge(int[] arr, int start, int mid, int end, int[] temp) {int left = start;int right = mid + 1;int index = start;while (left <= mid && right <= end) {if (arr[left] <= arr[right]) {temp[index++] = arr[left++];} else {temp[index++] = arr[right++];}}while (left <= mid) {temp[index++] = arr[left++];}while (right <= end) {temp[index++] = arr[right++];}for (int i = start; i <= end; i++) {arr[i] = temp[i];}}public static void main(String[] args) {int[] arr = {5, 2, 8, 4, 9, 1, 3, 7, 6};mergeSort(arr);System.out.println("Sorted array: " + Arrays.toString(arr));}
}

在这里插入图片描述

结果

运行以上代码,输出结果为:Sorted array: [1, 2, 3, 4, 5, 6, 7, 8, 9],表示归并排序对给定的数组进行了升序排序。

解释

在mergeSort方法中,首先判断数组的长度是否小于等于1,如果是,则直接返回。然后创建一个临时数组temp,并调用mergeSort方法对数组进行递归排序。在mergeSort方法中,首先计算出数组的中间位置mid,然后分别对左半部分和右半部分进行递归排序,最后调用merge方法将排序好的左右两部分合并起来。在merge方法中,使用双指针分别指向左半部分和右半部分的起始位置,比较两个指针所指的元素大小,将较小的元素放入临时数组temp中,并将对应指针向后移动一位。最后将临时数组temp中的元素复制回原数组arr中,完成排序。

图片: Alt

相关文章:

排序进行曲-v3.0

文章目录 小程一言归并排序步骤举例总结时间复杂度分析&#xff1a;空间复杂度分析&#xff1a;注意 应用场景总结 实际举例Other 代码实现结果解释 小程一言 这篇文章是在排序进行曲2.0之后的续讲&#xff0c; 这篇文章主要是对归并排序进行细致分析&#xff0c;以及操作。 希…...

编辑列表操作时的一些思考,关于全量和增量操作

假设我有一个这样的页面&#xff0c;需要对用户的信息做编辑操作 角色下面有一些菜单项&#xff0c;通过一张角色-菜单关系表来维护&#xff0c;那么我要在编辑用户后也要对用户角色关系表做修改&#xff0c;是经过两次比较分别计算出需要增加或者删除的角色用户关系&#xff0…...

【python】Python tkinter库实现重量单位转换器的GUI程序

文章目录 前言学到什么?导入模块和库创建一个GUI窗口定义函数 from_kg()创建标签、输入框、文本框和按钮设置组件的布局运行窗口循环完整代码运行效果结束语 前言 这段代码是一个简单的重量单位转换器的 GUI 程序&#xff0c;使用了 Python 的 tkinter 库来创建图形界面。该程…...

CVPR2023新作:源数据集对迁移学习性能的影响以及相应的解决方案

Title: A Data-Based Perspective on Transfer Learning (迁移学习的基于数据的观点) Affiliation: MIT (麻省理工学院) Authors: Saachi Jain, Hadi Salman, Alaa Khaddaj, Eric Wong, Sung Min Park, Aleksander Mądry Keywords: transfer learning, source dataset, dow…...

《TCP IP 网络编程》第十五章

第 15 章 套接字和标准I/O 15.1 标准 I/O 的优点 标准 I/O 函数的两个优点&#xff1a; 除了使用 read 和 write 函数收发数据外&#xff0c;还能使用标准 I/O 函数收发数据。下面是标准 I/O 函数的两个优点&#xff1a; 标准 I/O 函数具有良好的移植性标准 I/O 函数可以利用…...

新特性解读 | MySQL 8.0 字段信息统计机制

作者通过一个案例详细说明了 MySQL 8.0 字段信息统计机制的相关参数和使用方式。 作者&#xff1a;杨奇龙 网名“北在南方”&#xff0c;资深 DBA&#xff0c;主要负责数据库架构设计和运维平台开发工作&#xff0c;擅长数据库性能调优、故障诊断。 本文来源&#xff1a;原创投…...

基于Java+Swing实现超级玛丽游戏

基于JavaSwing实现超级玛丽游戏 一、系统介绍二、功能展示三、其他系统 一、系统介绍 超级玛丽小游戏的JAVA程序&#xff0c;进入游戏后首先按空格键开始&#xff0c;利用方向键来控制的马里奥的移动&#xff0c;同时检测马里奥与场景中的障碍物和敌人的碰撞&#xff0c;并判断…...

Day12-1-Webpack前端工程化开发

Webpack前端工程化 1 案例-webpack打包js文件 1 在index.html中编写代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><me…...

JUnit教程_编程入门自学教程_菜鸟教程-免费教程分享

教程简介 JUnit是一个Java语言的单元测试框架。它由Kent Beck和Erich Gamma建立&#xff0c;逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个。 JUnit有它自己的JUnit扩展生态圈。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。JUnit是由 Erich Gamma 和…...

Hive 安装介绍

介绍 Hive是基于Hadoop的一个数据仓库工具&#xff0c;可以将结构化的数据文件映射为一张数据库表&#xff0c;并提供类SQL查询功能。 其本质是将SQL转换为MapReduce的任务进行运算&#xff0c;底层由HDFS来提供数据的存储&#xff0c;说白了hive可以理解为一个将SQL转换为Ma…...

npm ERR! code EPERM npm ERR! syscall unlink npm ERR!错误解决方法

npm ERR! code EPERM npm ERR! syscall unlink npm ERR!错误解决方法 1、问题描述2、解决方法 1、问题描述 由于之前电脑系统的原因&#xff0c;电脑重置了一下&#xff0c;之前安装的环境都没了&#xff0c;然后在重新安装node.js后在使用npm安装时总是报如下错误&#xff1a…...

redis 高级篇4 分布式锁

一 redis架构图 1.1 redis的架构图 1.2 分布式锁满足条件 1.独占性&#xff1b;2.高可用&#xff1b;3.防死锁&#xff1b;4.不乱抢&#xff1b;5.重入性 二 分布式锁的案例情况 2.1 分布式锁1:单机分布式部署 描述&#xff1a; 使用lock锁和synchronized&#xff0c;单机…...

TPU-NNTC 编译部署LPRNet 车牌识别算法

TPU-NNTC 编译部署LPRNet 车牌识别算法 注意&#xff1a; 由于SOPHGO SE5微服务器的CPU是基于ARM架构&#xff0c;以下步骤将在基于x86架构CPU的开发环境中完成 初始化开发环境(基于x86架构CPU的开发环境中完成)模型转换 (基于x86架构CPU的开发环境中完成) 处理后的LPRNet 项…...

在线/开源GNSS处理软件/平台介绍

当前&#xff0c;存在较多的GNSS开源/免费软件&#xff0c;可用于质量检核、RTK解算和PPP解算等&#xff0c;本文总结了部分常用的处理软件&#xff0c;其详细信息如表1和表2所示。 表1 常用GNSS预处理&#xff08;格式转换、质量检核&#xff09;软件&#xff1a; 软件名称 …...

SpringBoot集成企业微信群聊机器人消息

目录 参考文档概述一、功能作用二、应用场景三、 群机器人发送限制四、创建机器人1、添加2、群机器人Webhook地址 五、发送消息1、文本 text请求体 图文连接 news 参考文档 官方文档 企业微信群机器人应用 概述 现在很多企业都在使用企业微信进行工作交流&#xff0c;自从企…...

​五、驱动 - ​音频系统硬件电路

文章目录 1. 音频系统硬件电路结构2. 蓝牙音频2.1 音乐播放2.2 VoIP通话2.3 4G通话3. 其他3.1 什么是S/PDIF1. 音频系统硬件电路结构 录音放音设备:mic、speaker、耳机、听筒这些带有录音放音功能的设备(因为录放设备可能是模拟设备也可能是数字设备,所以接口可能是模拟接口…...

【图像分割和识别】活动形状模型 (ASM) 和活动外观模型 (AAM)(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

HTML基础介绍2

表单格式化 ctrld&#xff1a;复制选中行数的所有代码 ctrlx&#xff1a;删除代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>表单综合案例</title> </head> <body> <!--…...

rar压缩包怎么改成zip格式

不知道大家有没有遇到需要转换压缩包格式的问题&#xff0c;今天想和大家分享rar压缩包改成zip格式的方法。 方法一&#xff1a; 直接修改rar压缩包的后缀名变为zip&#xff0c;就可以修改压缩包文件格式了 方法二&#xff1a; 先将rar压缩包解压出来&#xff0c;然后再将解…...

Mac 补丁管理

Mac 补丁管理涉及通过扫描收集所有缺失补丁的完整列表、下载缺失的补丁、在非生产计算机上测试它们&#xff0c;最后将它们推广到生产环境中进行部署来管理 macOS 端点&#xff0c;修补 Mac 设备&#xff08;又称 Mac 修补&#xff09;可增强 macOS 环境的安全级别。 什么是 m…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周&#xff0c;有很多同学在写期末Java web作业时&#xff0c;运行tomcat出现乱码问题&#xff0c;经过多次解决与研究&#xff0c;我做了如下整理&#xff1a; 原因&#xff1a; IDEA本身编码与tomcat的编码与Windows编码不同导致&#xff0c;Windows 系统控制台…...

stm32G473的flash模式是单bank还是双bank?

今天突然有人stm32G473的flash模式是单bank还是双bank&#xff1f;由于时间太久&#xff0c;我真忘记了。搜搜发现&#xff0c;还真有人和我一样。见下面的链接&#xff1a;https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...