排序算法(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是比较稳定的。

那么,,,

数据结构初阶----完结。

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

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

相关文章

AI智能体与大语言模型:重塑SaaS系统的未来航向

在数字化转型的浪潮中,软件即服务(SaaS)系统一直是企业提升效率、优化业务流程的重要工具。随着AI智能体和大语言模型(LLMs)的迅速发展,SaaS系统正迎来前所未有的变革契机。本文将从AI智能体和大语言模型对…

AOP进阶-03.切入点表达式-execution

一.切入点表达式-execution 访问修饰符(public/private等),包名.类名.,throws 异常都可以省略,但是建议包名.类名.不要省略,否则的话匹配范围太大影响程序执行效率。 *主要用来匹配单个参数,通配任意返回值、包名、类…

神经网络发展简史:从感知机到通用智能的进化之路

引言 神经网络作为人工智能的核心技术,其发展历程堪称一场人类对生物大脑的致敬与超越。本文将用"模型进化"的视角,梳理神经网络发展的五大关键阶段,结合具象化比喻和经典案例,为读者呈现一幅清晰的AI算法发展图谱。 一…

NLP09-加强1-对比SVM

支持向量机(SVM) (一)导入 SVM 相关库 (二) 修改模型初始化 (三) 比较 朴素贝叶斯分类器 SVM分类器 支持向量机(SVM) 代码修改基于NLP09-朴素贝叶斯问句…

Spring 源码硬核解析系列专题(八):Spring Security 的认证与授权源码解析

在前几期中,我们从 Spring 核心到 Spring Boot,再到 Spring Cloud,逐步探索了 Spring 生态的底层原理。作为企业级应用的关键组件,Spring Security 提供了全面的安全解决方案,包括认证(Authentication)和授权(Authorization)。本篇将深入 Spring Security 的源码,剖析…

DeepSeek 开源了 DeepEP

DeepSeek又开源了一个超强技术:DeepEP通信库。实现了MOE之间的通信,性能更强了! DeepEP作为全球首个专为MoE(专家混合)模型训练和推理量身定制的EP(专家并行)通信库,其诞生标志着通…

【C语言】指针笔试题

前言:上期我们介绍了sizeof与strlen的辨析以及sizeof,strlen相关的一些笔试题,这期我们主要来讲指针运算相关的一些笔试题,以此来巩固我们之前所学的指针运算! 文章目录 一,指针笔试题1,题目一…

电脑键盘知识

1、键盘四大功能区 1. 功能区 2. 主要信息输入区 3. 编辑区 4. 数字键盘区 笔记本电脑键盘的功能区,使用前需先按Fn键 1.1、功能区 ESC:退出 F1:显示帮助信息 F2:重命名 F4:重复上一步操作 F5:刷新网页 …

在 macOS 系统上安装 kubectl

在 macOS 系统上安装 kubectl 官网:https://kubernetes.io/zh-cn/docs/tasks/tools/install-kubectl-macos/ 用 Homebrew 在 macOS 系统上安装 如果你是 macOS 系统,且用的是 Homebrew 包管理工具, 则可以用 Homebrew 安装 kubectl。 运行…

004 Kafka异常处理

6.异常处理 文章目录 6.异常处理1.异常分类与处理原则2.生产者异常处理1. 同步发送捕获异常2. 异步发送回调处理 3.消费者异常处理1.全局异常处理器2.方法级处理3.重试yml配置 4.死信队列(DLQ)配置1. 启用死信队列2. 手动发送到DLQ 5.事务场景异常处理1.…

Spring MVC框架六:Ajax技术

精心整理了最新的面试资料,有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 简介 jQuery.ajax Ajax原理 结语 创作不易,希望能对大家给予帮助 想要获取更多资源? 点击链接获取

数据结构与算法:二维前缀和、二维差分及离散化技巧

前言 有一维的前缀和以及差分当然有二维的~ 一、二维前缀和 1.内容 二维前缀和就是求二维数组上从&#xff08;0,0&#xff09;位置到&#xff08;i,j&#xff09;位置的累加和。 2.模板——二维区域和检索 - 矩阵不可变 class NumMatrix { public:vector<vector<i…

在 Vue 组件中,如何确认父组件在 add 模式下传入 value 的情况及其对子组件 getProducts() 方法的触发影响?

文章目录 父组件中 <ave-form> 的使用add 模式下触发逻辑value 的传入情况是否触发 getProducts()&#xff1f; 验证 add 模式下 getProducts() 是否触发结论&#xff1a; 检查父组件传入 value 的完整情况如何明确知道父组件传入的 value最终回答 父组件 index.vue子组件…

第十四届蓝桥杯Scratch11月stema选拔赛真题——小猫照镜子

编程实现&#xff1a; 小猫照镜子。(背景非源素材) 具体要求&#xff1a; 1). 运行程序&#xff0c;角色、背景如图所示&#xff1b; 完整题目可点击下方链接查看&#xff0c;支持在线编程~ 小猫照镜子_scratch_少儿编程题库学习中心-嗨信奥https://www.hixinao.com/tiku/s…

React + TypeScript 实现数据库逆向生成数据模型指南

React TypeScript 实现数据库逆向生成数据模型全栈指南 引言&#xff1a;逆向工程在现代开发中的价值 在微服务架构和快速迭代的背景下&#xff0c;数据库逆向生成数据模型已成为提升开发效率的核心技术。传统手动编写模型的方式存在模式同步延迟和类型安全缺失两大痛点。本文…

Android Audio实战——音频相关基础概念(附)

Android Audio 开发其实就是媒体源数字化的过程,通过将声波波形信号通过 ADC 转换成计算机支持的二进制的过程叫做音频采样 (Audio Sampling)。采样 (Sampling) 的核心是把连续的模拟信号转换成离散的数字信号。 一、声音的属性 1、响度 (Loudness) 响度是指人类可以感知到的…

小程序类目调整汇总公告

各位小程序开发者&#xff1a; 为进一步加强平台的规范管理&#xff0c;优化开发者类目选择体验&#xff0c;现对以下类目进行调整&#xff0c;请各位开发者知悉。 类目新增 非个人主体 #【交通服务-国际客运】 现资质要求 &#xff08;2选1&#xff09;&#xff1a; 1…

python的列表和元组别再傻傻分不清啦

目录 什么是下标&#xff1a; 正数索引&#xff1a;正数索引从左到右&#xff0c;从 0 开始。 负数索引&#xff1a;负数索引从右到左&#xff0c;从 -1 开始。 切片&#xff08;slice&#xff09;&#xff1a;除了单个元素&#xff0c;Python还支持通过切片访问序列的子集。…

dubbo转http方式调用

业务背景&#xff1a;在当前项目下&#xff0c;所有前端请求均通过外层网关转发到后端这边的dubbo服务&#xff0c;现计划去掉网关层&#xff0c;由前端直接http调用后端dubbo。 解决方案&#xff1a;在前端调用方式不变的前提下&#xff0c;后端服务新建controller层&#xf…

OpenHarmony构建系统实践-跨部件引用

上一篇通过gn构建系统利用部件构建了可执行程序、动态库和配置文件&#xff0c;以及部件内的引用&#xff0c;本篇通过实现跨部件的模块引用&#xff0c;通过实现部件间的使用方法&#xff0c;以此来达到复用三方部件和模块库的目的。 本节以实现两个自定义的部件为例&#xff…