排序算法(3):
这是我们的最后一篇排序算法了,也是我们的初阶数据结构的最后一篇了。
我们来看,我们之前已经讲完了插入排序,选择排序,交换排序,我们还剩下最后一个归并排序,我们今天就讲解归并排序,另外我们还要再讲解一下计数排序。
我们前面的七种排序算法,在排序的过程中都要进行数据大小的比较,我们把这些算法统称为比较排序。
但是我们的计数排序不是比较排序。
我们先来看我们的归并排序:
归并排序:
归并排序算法思想:
归并排序(MERGE-SORT)是建⽴在归并操作上的⼀种有效的排序算法,该算法是采⽤分治法(Divide andConquer)的⼀个⾮常典型的应⽤。将已有序的⼦序列合并,得到完全有序的序列;即先使每个 ⼦序列有序,再使⼦序列段间有序。若将两个有序表合并成⼀个有序表,称为⼆路归并。归并排序核 ⼼步骤:
我们看我们的这个图片,这个就相当于是我们的思路,首先,我们的这个数组是无序的,我们先把数组从中间分开,分成两个数组,然后就得到了两个数组,这两个数组也是无序的,然后我们就继续进行分组,然后我们就得到了4个无序的数组,然后我们再进行分组,最后我们就得得到了8个数组,这8个数组里面的都是只有一个数据的,所以他们就都是有序的,这时候我们就要把这些有序的数组合成一个有序的数组,我们之前学过把两个有序的数组合并成一个有序的数组,我们就把两个有序的数组合成一个,我们不断地两两相合并,直到把我们分出来的数组全部合并起来,最后我们就得到了我们的有序的数组。
接下来我们来实现一下我们的代码:
我们来看我们的代码,我们先来看下面的我们的归并排序:
我们把数组传过来,然后我们动态开辟一块和我们的数组的大小相同的内存。
为什么我们要动态开辟一块内存呢?因为如果我们直接在我们的原数组上面进行修改的话会比较麻烦,开辟新的动态内存也很方便。
然后我们来分析我们的代码,我们开辟完内存以后,我们把数组和我们数组的首尾下标和动态开辟的数组传入到我们的函数里面。
进入到我们的函数内部,我们的这个函数是递归版本的,我们进入到函数以后我们先判断一下我们传过来的数组个数,如果数组个数只有一个的时候,我们就返回,数组个数为1个,这个数组就是有序的,然后我们求出mid中间值,再次给他分组,,,当我们分组分到最后的时候,
我们的函数,进入到10的的时候我们判断,一个数据,返回,然后进入到6去,也是一个数据,返回,最后回到上面,这时候我们就把这两个有序的数组进行合并,合并成一个有序的数据,就变成了下面的数据,那么这个数组也是有序的,然后旁边的也是按这样的方式,合成小的有序的数据,然后这又和我们的这个数据合并,成了大的有序的数据。
所以,我们不管什么时候合数据,都是已经有序的数据,因为递归函数已经把他弄好了。
然后我们来合并这个两个有序的数组,我们把小的放到我们的tmp的前面,大的放到后面,走到最后的话,我们的两个数组里面的数据如果没有排完的话,我们就分别看他们要不要排。
然后我们把我们排好在tmp的数据导入到我们的arr里面。(我们这里是排完一次就导入一次)
代码实现完了,我们来看一下归并排序的时间复杂度:n logn
空间复杂度的话:n,(因为我们额外动态开辟了一个数组空间);
我们来看这个图片,我们的比较排序算法的最终比较:这里我们可以看到我们的归并排序的速度也不慢,图里面被标出的:堆排序,快速排序,归并排序 这三种排序算法的时间复杂度都是n logn
这三种也是比较快的,当然,希尔排序也比较快,希尔排序的时间复杂度为n^1.3,也非常快。
接着就是直接插入排序,然后是直接选择排序,然后是冒泡排序。
好了,前面的7种比较排序我们已经看完了,我们现在来看非比较排序
非比较排序:
计数排序:
计数排序⼜称为鸽巢原理,是对哈希直接定址法的变形应⽤。
操作步骤:
1)统计相同元素出现次数
2)根据统计的结果将序列回收到原来的序列中
我们看这个图片,这个就是我们的计数排序。
我们先创建一个数组,让数组里面的数据全部为0。
当我们传过来数组的时候,我们先遍历我们的数组,当我们开始走到6的时候,我们就让下标为6的数据加1,然后再走到1,我们就让下标为1的数据++,然后我们走到了2,我们就让下标为2的数据++;然后继续。。。。直到最后我们把数组遍历完了,然后我们创造的数组,里面就会变成我们图中的样子,我们有了这个数组以后,我们就可以直接对我们的数据进行排序了,我们就看什么数据有几个,从前往后的排列,就比如我们图里面的数组,我们看到数据1有两个,我们就在我们的数组的前两个位置都放上数据1,然后数据2也是有两个,我们就放两个数据2。。。。最后我们就能排好我们的数组。
那么我们该怎么创造我们的数组呢?
跟上面的一样取出数组里面的最大值然后+1,创造一个这么大的数组吗?
我们来看下面的情况:
我们来看这个图片,这次我们要排的数据是100到109,这时候我们能取他的最大值然后 +1吗?
我们要创造110个空间,但是我们的数组里面最小的数据为100,这就会导致前面下标(0--99)100个空间被浪费掉,这样的话损耗是比较大的,那我们怎么办呢?
我们就在数组里面找到最大的数据,再找到最小的数据,最小的数据,所以这时候我们的数组的空间的大小就是最大的数据 - 最小的数据 + 1。
我们来看这个图,这时候我们的数组的range就是10,然后我们的下标还是0开始的,减去了我们的最小值,
这个就是我们的代码的实现;
当然,当我们要排序的数组是前后大小相差比较大的话,
这时候我们的计数排序可能就不太适合了。
然后我们的这个排序的复杂度:
时间复杂复杂度因为我们的循环,空间复杂度的话,因为我们额外申请了一个range大小的内存空间。
排序算法稳定性的分析:
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的 相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,⽽在排序后的序列中,r[i]仍在r[j]之 前,则称这种排序算法是稳定的;否则称为不稳定的。
什么意思呢?
比如我们的这个数组,当我们排序完后,我们的前面的5还是在后面5的前面的。这样的话这个排序就hi是比较稳定的。
那么,,,
数据结构初阶----完结。
相关文章:
排序算法(3):
这是我们的最后一篇排序算法了,也是我们的初阶数据结构的最后一篇了。 我们来看,我们之前已经讲完了插入排序,选择排序,交换排序,我们还剩下最后一个归并排序,我们今天就讲解归并排序,另外我们还…...
AI革命下的多元生态:DeepSeek、ChatGPT、XAI、文心一言与通义千问的行业渗透与场景重构
前言 人工智能技术的爆发式发展催生了多样化的AI模型生态,从通用对话到垂直领域应用,从数据挖掘到创意生成,各模型凭借其独特的技术优势与场景适配性,正在重塑全球产业格局。本文将以DeepSeek、ChatGPT、XAI(可解释人…...
服务端配置TCP探活,超出探活时间后的行为?
server端启动 (完整源码在最后) 配置探活 setsockopt(client_fd, IPPROTO_TCP, TCP_KEEPIDLE, &(int){5}, sizeof(int)); // 空闲60秒后探测setsockopt(client_fd, IPPROTO_TCP, TCP_KEEPINTVL, &(int){10}, sizeof(int)); // 探测间隔10秒…...
Eclipse安装和配置环境教程包含下载、安装、汉化(附安装包)
文章目录 前言一、JDK 安装二、Eclipse IDE 安装三、Eclipse软件汉化(可选)四、安装完成 前言 在编程的世界里,一款好的开发工具能让效率大幅提升,Eclipse 2024 便是这样的利器。不过,其安装过程涉及 JDK 配置、软件本…...
nginx简单命令启动,关闭等
启动命令 #启动nginx start nginx重启命令 比如修改了配置文件,用这个命令重启生效 #重启nginx nginx -s reload3,查看端口占用 #查看端口占用 netstat -aon4,关闭nginx 如果使用cmd命令窗口启动nginx, 关闭cmd窗口是不能…...
SQL------搭建sql靶场和打开sql靶场及报错解决
搭建sql靶场 1.下载安装包与文件 在官网上下载phpstudy网址: http://www.xp.cn 下载sqli-labs的网址: https://github.com/Audi-1/sqli-labs 2.下载小皮面板 打开安装包 安装,记得改自己想要安装的路径 打开php版本 记得下载5.几的版本&…...
对话式AI引擎:DeepSeek技术引领多模态交互新篇章
摘要 DeepSeek技术公司推出了一项创新服务——“对话式AI引擎”,仅需两行代码即可激活任意大型AI模型的语音对话功能。这项技术使得文本型AI模型迅速转变为具备实时语音对话能力的多模态交互模型,解决了大型AI模型在语音交互方面的不足,为AI行…...
在什么情况下需要使用光谱相机呢?
1.需要捕捉不可见光信息时 光谱相机不仅能捕捉可见光,还能记录红外、紫外等波段的光谱信息。以下场景尤其适用: 环境监测:检测水质、空气污染物等肉眼无法观察的物质。 农业监测:分析植物的近红外反射率,判断作物健…...
nnUNetv2用自己的数据集训练推理
有什么不懂的大家可以在评论区问我,我一定会积极回复哒!!! 一、环境配置 首先创建一个虚拟环境 conda create -n nnunet python3.9 conda activate nnunet 然后在pytorch官网,安装pytorch,这里我安装的是…...
std::thread的同步机制
在 C 中,std::thread 用于创建和管理线程。为了确保多个线程能正确、安全地访问共享资源,避免数据竞争和不一致问题,需要使用同步机制。 互斥锁(std::mutex) 原理:互斥锁是一种最基本的同步原语ÿ…...
Matplotlib 绘图标记
Matplotlib 绘图标记 引言 Matplotlib 是一个功能强大的 Python 绘图库,广泛用于数据可视化。在 Matplotlib 中,绘图标记(markers)是数据点在图表中显示的方式。正确的使用绘图标记可以增强图表的可读性和美观性。本文将详细介绍…...
Web3.py 入门笔记
Web3.py 学习笔记 📚 1. Web3.py 简介 🌟 Web3.py 是一个 Python 库,用于与以太坊区块链进行交互。它就像是连接 Python 程序和以太坊网络的桥梁。 官方文档 1.1 主要功能 查询区块链数据(余额、交易等)发送交易与…...
《论企业集成平台的理解与应用》审题技巧 - 系统架构设计师
企业集成平台的理解与应用——论文写作框架 一、考点概述 本论题“企业集成平台的理解与应用”主要考察的是计算机软件测试工程师对于企业集成平台(EIP)的深入理解以及在实际项目中的应用能力。论题涵盖了以下几个核心内容: 首先ÿ…...
IO 和NIO有什么区别?
IO 与 NIO 的区别详解 Java 中的 IO(Input/Output) 和 NIO(New IO 或 Non-blocking IO) 是两种不同的输入输出处理机制,主要区别体现在设计模型、性能优化和应用场景上。以下是详细对比: 1. 阻塞与非阻塞模…...
音频进阶学习十六——LTI系统的差分方程与频域分析一(频率响应)
文章目录 前言一、差分方程的有理式1.差分方程的有理分式2.因果系统和ROC3.稳定性与ROC 二、频率响应1.定义2.幅频响应3.相频响应4.群延迟 总结 前言 本篇文章会先复习Z变换的有理分式,这是之前文章中提过的内容,这里会将差分方程和有理分式进行结合来看…...
Nginx面试宝典【刷题系列】
文章目录 1、nginx是如何实现高并发的?2、Nginx如何处理HTTP请求?3、使用“反向代理服务器”的优点是什么?4、列举Nginx服务器的最佳用途。5、Nginx服务器上的Master和Worker进程分别是什么?6、什么是C10K问题?7、请陈述stub_status和sub_filter指令的…...
【语法】C++的string
目录 4个默认成员函数 迭代器 string的扩容: capacity(): reserve(): resize(): 插入与删除: c_str: find()和substr: getline(): 在C语言中,要想存储一串字符,往往用的都是char arr[],也就是字…...
支持selenium的chrome driver更新到133.0.6943.141
最近chrome释放新版本:133.0.6943.141 如果运行selenium自动化测试出现以下问题,是需要升级chromedriver才可以解决的。 selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only s…...
【2025.2.25更新】wordpress免费AI插件,文章内容、图片自动生成、视频自动生成、网站AI客服、批量采集文章,内置deepseek联网满血版
wordpress免费AI插件,文章内容、文章图片、长尾关键词、视频自动生成、网站AI客服、批量采集文章,插件已接入腾讯云大模型知识引擎xDeepSeek,基于腾讯云大模型知识引擎xDeepSeek可联网满血版,插件可实现文章生成、长尾关键词生成、…...
KylinSP3 | 防火墙和麒麟安全增强设置KySec
一、系统防火墙原理 麒麟操作系统从V10版本开始,默认使用了Firewalld防火墙,Firewalld是能提供动态管理的防火墙,支持网络/防火墙区域,用于定义网络连接或接口的信任级别。支持IPv4和IPv6防火墙设置、以太网桥接和IP集。将运行时…...
DeepSeek + Higress AI 网关/Spring AI Alibaba 案例征集
诚挚地感谢每一位持续关注并使用 Higress 和 Spring AI Alibaba 的朋友。我们会持续投入,力图把 Higress 变得更好,把 Higress 和 Spring AI Alibaba 社区和生态变得更加繁荣。 关于 Higress: Higress 除了作为云原生网关支持 Web 应用的部…...
sql server笔记
创建数据库 use master gocreate database stuuuuu//删除数据库if db_id ($$$) is not nullDrop database [$$$] go//新建表USE [studyTest] GOSET ANSI_NULLS ON GOSET QUOTED_IDENTIFIER ON GOCREATE TABLE [dbo].[Table_1]([id] [int] NULL,[name] [varchar](10) NULL ) ON…...
Vue 3 搭建前端模板并集成 Ant Design Vue(2025)
一、环境安装 截止2025.2.6 ,官网发布的vue 3 稳定版本是 V 3.5.13 根据此时的官方文档要求,node 版本需要大于等于 V 18.3 于是使用 nvm 安装 v 20.18.0 二、创建项目 使用 Vue 官方推荐的脚手架 create-vue 快速创建 Vue3 的项目: 快速上手 | Vue.js…...
Word表格中如何只单独调整某一单元格宽度
大家好,我是小鱼。 在日常制作Word表格时,表格中不同单元格有时需要设置不同的宽度,但是很多小伙伴会发现想单独调整某一个单元格宽度时,发现其它单元格宽度也会发生变化。那么,到底怎么才能单独调整某一单元格宽度呢…...
CSS基础选择器和文字属性控制
CSS 层叠样式表(Cascading Style Sheets),是一种样式表语言,它和HTML一起被用来描述网页的样式。HTML 主要用来定义网页的内容,也就是骨架,CSS 用来定义网页的样式。 CSS 是由选择器和属性声明组成的。选择器用来选择元素&#…...
保护密码等敏感信息的几个常用方法
概述 在生产环境,保护数据库账号密码等敏感信息是至关重要的,这些信息不能被所有研发工程师看见,本文介绍几种避免明文存储的常用方法。 方法1: 使用配置中心加密 适用场景:已采用配置中心(如Spring Clou…...
【Golang 面试题】每日 3 题(六十七)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/UWz06 📚专栏简介:在这个专栏中,我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏…...
JavaScript系列(89)--前端模块化工程详解
前端模块化工程详解 🧩 前端模块化是现代Web开发的核心理念之一,它帮助我们组织和管理日益复杂的前端代码。本文将详细探讨前端模块化工程的各个方面,从基础概念到实际应用。 模块化概述 🌟 💡 小知识:模…...
PDF处理控件Aspose.PDF教程:使用 Python 将 PDF 转换为 TIFF
TIFF文件是高质量图像的首选。它们广泛用于印刷、存档和图形设计。企业通常需要转换PDF文档以获得更好的兼容性。了解如何以编程方式执行此转换可以节省时间和资源。在这篇教程中,我们将探讨如何使用 Python 将 PDF 转换为 TIFF。 本文涵盖以下主题: P…...
【开源免费】基于SpringBoot+Vue.JS美食烹饪互动平台(JAVA毕业设计)
本文项目编号 T 219 ,文末自助获取源码 \color{red}{T219,文末自助获取源码} T219,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
QT 引入Quazip和Zlib源码工程到项目中,无需编译成库,跨平台,加密压缩,带有压缩进度
前言 最近在做项目时遇到一个需求,需要将升级的文件压缩成zip,再进行传输; 通过网络调研,有许多方式可以实现,例如QT私有模块的ZipReader、QZipWriter;或者第三方库zlib或者libzip或者quazip等࿱…...
【GO】学习笔记
目录 学习链接 开发环境 开发工具 GVM - GO多版本部署 GOPATH 与 go.mod go常用命令 环境初始化 编译与运行 GDB -- GNU 调试器 基本语法与字符类型 关键字与标识符 格式化占位符 基本语法 初始值&零值&默认值 变量声明与赋值 _ 下划线的用法 字…...
docker安装etcd:docker离线安装etcd、docker在线安装etcd、etcd镜像下载、etcd配置详解、etcd常用命令、安装常见问题总结
官方网站 官方网址:etcd 二进制包下载:Install | etcd GitHub社区项目:etcd-io GitHub GitHub社区项目版本历史:Releases etcd-io/etcd GitHub 一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令…...
港科大提出开放全曲音乐生成基础模型YuE:可将歌词转换成完整歌曲
YuE是港科大提出的一个开源的音乐生成基础模型,专为音乐生成而设计,专门用于将歌词转换成完整的歌曲(lyrics2song)。它可以生成一首完整的歌曲,时长几分钟,包括朗朗上口的声乐曲目和伴奏曲目。YuE 能够模拟…...
Hive从入门到运用
hive简介 hive的设计思想(本质是一个翻译器) 上传安装包 解压,查看 运行hive(一定要启动hadoop,是有依赖关系的。) 测试启动方法,和建表 文件创建很上传到hdfs,直接上传到hive表的目…...
unity学习55:按钮 button
目录 1 按钮 button 1.1 按钮button 其实就是一个组合体 1.2 测试按钮,在UI中添加1个按钮 1.3 按钮的属性 2 按钮的图片属性 3 按钮的变换 transition 3.1 按颜色变换 3.2 按图片精灵变换 3.3 按动画变换 4 按钮的导航 5 按钮的事件和脚本 1 按钮 …...
《论基于构件的软件开发方法及其应用》审题技巧 - 系统架构设计师
软考论文写作框架:基于构件的软件开发方法及其应用 一、考点概述 本论题“基于构件的软件开发方法及其应用”主要考察的是软件工程专业中关于基于构件开发(CBSD)的深入理解与实践应用。考点涵盖以下几个方面: 首先,…...
穷举vs暴搜vs深搜vs回溯vs剪枝(典型算法思想)—— OJ例题算法解析思路
回溯算法的模版 void backtrack(vector<int>& path, vector<int>& choice, ...) {// 满⾜结束条件if (/* 满⾜结束条件 */) {// 将路径添加到结果集中res.push_back(path);return;}// 遍历所有选择for (int i 0; i < choices.size(); i) {// 做出选择…...
java23种设计模式-命令模式
命令模式(Command Pattern)学习笔记 1. 模式定义 行为型设计模式,将请求封装为对象,使请求的发送者与接收者解耦。支持请求的排队、记录、撤销/重做等操作。 2. 适用场景 ✅ 需要将操作参数化 ✅ 需要支持事务操作(…...
交流异步电动机PI双闭环SVPWM矢量控制Simulink
关注微♥“电机小子程高兴的MATLAB小屋”获取专属优惠 1.模型简介 本仿真模型基于MATLAB/Simulink(版本MATLAB 2017Ra)软件。建议采用matlab2017 Ra及以上版本打开。(若需要其他版本可联系代为转换) 2.仿真算法: (…...
利用 Open3D 保存并载入相机视角的简单示例
1. 前言 在使用 Open3D 进行三维可视化和点云处理时,有时需要将当前的视角(Camera Viewpoint)保存下来,以便下次再次打开时能够还原到同样的视角。本文将演示如何在最新的 Open3D GUI 界面(o3d.visualization.gui / o…...
kiln微调大模型-使用deepseek R1去训练一个你的具备推理能力的chatGPT 4o
前言 随着deepseek的爆火,对于LLM的各种内容也逐渐步入我的视野,我个人认为,可能未来很长一段时间,AI将持续爆火,进入一段时间的井喷期,AI也会慢慢的走入我们每个家庭之中,为我们的生活提供便利…...
《从Kokoro看开源语音模型的“无限可能”》:此文为AI自动生成
开源语音模型 Kokoro 是一款轻量级、高性能的文本转语音(TTS)模型,以下是关于它的详细介绍: 核心优势 卓越的音质:即使参数规模仅 8200 万,也能生成自然流畅、富有表现力的语音。轻量高效:占用资源少,运行速度快,在 CPU 上即可实现近乎实时的语音生成,在 GPU 端则能…...
Spring 事务和事务传播机制(详解)
1 .事务 1.1.什么是事务? 事务是一组操作的集合,是不可分割的操作 事务作为一个整体,要不同时完成,要不同时失败 1.2什么时候需要事务? 关于金钱的操作基本都会有事务 例如转账操作: 第一步 A账号 - 500元第二步 B账…...
Innodb MVCC实现原理
什么是MVCC? MVCC全称多版本并发控制,是在并发访问数据库时对操作数据做多版本管理,避免因为写数据时要加写锁而阻塞读取数据的请求问题。 Innodb对mvcc的实现 1、事务版本号 每次事务开启前都会从数据库获得一个自增长的事务ID,可以从事…...
【网络编程】网络套接字和使用案例
一、为什么大多数网络编程使用套接字 在网络编程中,套接字 (socket) 是最常用的接口,但并不是所有的底层通信都依赖于套接字。尽管如此,绝大多数网络应用(特别是在操作系统层面)都使用套接字进行通信,因为…...
【Java企业生态系统的演进】从单体J2EE到云原生微服务
Java企业生态系统的演进:从单体J2EE到云原生微服务 目录标题 Java企业生态系统的演进:从单体J2EE到云原生微服务摘要1. 引言2. 整体框架演进:从原始Java到Spring Cloud2.1 原始Java阶段(1995-1999)2.2 J2EE阶段&#x…...
【爬虫基础】第二部分 爬虫基础理论 P1/3
上节内容回顾:【爬虫基础】第一部分 网络通讯 P1/3-CSDN博客 【爬虫基础】第一部分 网络通讯-Socket套接字 P2/3-CSDN博客 【爬虫基础】第一部分 网络通讯-编程 P3/3-CSDN博客 爬虫相关文档,希望互相学习,共同进步 风123456789ÿ…...
第2章_保护您的第一个应用程序
第2章_保护您的第一个应用程序 在本章中,您将学习如何使用 Keycloak 保护您的第一个应用程序。为了让事情更有趣,您将运行的示例应用程序由两部分组成,前端 Web 应用程序和后端 REST API。这将向您展示用户如何向前端进行身份验证࿰…...
山东大学软件学院人工智能导论实验之知识库推理
目录 实验目的: 实验代码: 实验内容: 实验结果 实验目的: 输入相应的条件,根据知识库推理得出相应的知识。 实验代码: def find_data(input_process_data_list):for epoch, data_process in enumerat…...