排序算法(3):

devtools/2025/2/27 9:59:38/

这是我们的最后一篇算法>排序算法了,也是我们的初阶数据结构的最后一篇了。

我们来看,我们之前已经讲完了插入排序,选择排序,交换排序,我们还剩下最后一个归并排序,我们今天就讲解归并排序,另外我们还要再讲解一下计数排序

我们前面的七种算法>排序算法,在排序的过程中都要进行数据大小的比较,我们把这些算法统称为比较排序。

但是我们的计数排序不是比较排序。

我们先来看我们的归并排序:

归并排序:

归并算法>排序算法思想:

归并排序(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.ppmy.cn/devtools/163023.html

相关文章

每天一个Flutter开发小项目 (4) : 构建收藏地点应用 - 深入Flutter状态管理

引言 欢迎回到 每天一个Flutter开发小项目 系列博客!在前三篇博客中,我们从零开始构建了计数器应用、待办事项列表应用,以及简易天气应用。您不仅掌握了 Flutter 的基础组件和布局,还学习了网络请求、JSON 解析等实用技能,更重要的是,我们一起探讨了高效的 Flutter 学习…

深入理解Redis:数据类型、事务机制及其应用场景

在当今快速发展的技术领域中,Redis作为一种高性能的内存数据库,已经被广泛应用于各种场景,从简单的缓存实现到复杂的数据处理任务。其灵活性和高效性主要来源于对多种数据结构的支持以及强大的功能特性,如事务处理、持久化选项、高…

新装的conda 以及pycharm未能正确初始化,或conda环境变量配置错误问题解决!!!

Windows PowerShell 版权所有(C) Microsoft Corporation。保留所有权利。 安装最新的 PowerShell,了解新功能和改进!https://aka.ms/PSWindows PS E:\Dev_project\MyProjects> conda cativate py12 usage: conda-script.py [-h…

青少年编程与数学 02-010 C++程序设计基础 11课题、程序结构

青少年编程与数学 02-010 C程序设计基础 11课题、程序结构 一、C程序结构二、main函数1. main 函数的基本形式1.1 无参数形式1.2 带参数形式 2. 参数解释3. 示例3.1 无参数形式3.2 带参数形式 4. 编译和运行4.1 编译4.2 运行 5. main 函数的返回值6. 总结 三、预处理指令1. #in…

uniapp 测试 IPA 包安装到测试 iPhone

将uniapp测试IPA包安装到测试iPhone有以下几种方法: 使用Xcode安装 确保计算机上安装了Xcode,并将iOS设备通过数据线连接到计算机。打开Xcode,在菜单栏中选择Window->Devices and Simulators,在设备列表中找到要安装的iPhone…

【含文档+PPT+源码】基于微信小程序的农产品自主供销商城系统

项目介绍 本课程演示的是一款基于微信小程序的农产品自主供销商城系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3…

(java/Spring boot)使用火山引擎官方推荐方法向大模型发送请求

首先在maven里面引入官方依赖 <dependency><groupId>com.volcengine</groupId><artifactId>volcengine-java-sdk-ark-runtime</artifactId><version>LATEST</version></dependency>然后我们编写测试类 package com.volcengin…

prometheus+node_exporter+grafana监控K8S信息

prometheusnode_exportergrafana监控K8S 1.prometheus部署2.node_exporter部署3.修改prometheus配置文件4.grafana部署 1.prometheus部署 包下载地址&#xff1a;https://prometheus.io/download/ 将包传至/opt 解压 tar xf prometheus-2.53.3.linux-amd64.tar.gz 移动到…