数据结构学习/复习15--排序部分复习总结

news2024/11/20 12:28:59

一、学过的排序

1.插入排序 2.希尔排序

3.直接选择排序 4.堆排序

5.冒泡排序 6.快速排序

7.归并排序 8.计数排序

二、各项排序的思想及改进(无特殊说明均以升序为例)

1.插入排序及其改进希尔排序

(1)插入排序的思想及具体操作细节

          将一个数字按顺序插入已排好序的数组,插入会涉及移动已排好序的部分。将数组中的每一个数与其之前的每一个数逐一比较,同时后移不比插入数据小的数,直到遇到比其小的,再插入在那个数后。

  (2)希尔排序的思想及具体操作细节

         在插入排序排序的基础上先每gap个数分为一组进行插入排序最后gap变为1对整个进行过分组的数组进行普通插入排序,由于已进行过分组插入排序的预排序处理,最后的插入排序效率会变高。希尔排序函数体几乎与插入排序一致

          

2.直接选择排序与堆排序

  (1)直接选择排序的思想及具体操作细节

   选择排序性能差,不常用。运用双指针思想,不断缩小排序范围,一次排序中去找当前排序范围中的最大与最小值,最大值放右边,最小值放左边,不断循环直至左右指针相遇。注意当左边界指向当前范围最大值后,原来的最小值位置存储了当前的最大值,所以右边界应与最小值位置交换

   

(2) 堆排序的思想与具体操作细节

   建堆,排升序建大堆,降序减小堆。建议使用向下调整建堆,比向上调整建堆效率高。建堆需要依靠父节点算子节点,也需要依靠子节点算父节点。大根堆是子节点比父节点小,小根堆是父节点比子节点小。

堆排序需要先根据升降序要求建堆,再对堆进行调整

 3.冒泡排序与快速排序及其改进

    (1)冒泡排序的思想及具体操作细节

       双重循环即可实现冒泡排序

(2)快速排序的思想及具体操作细节

 快速排序的每次排序其实只将数组中的一个数放置到了正确位置,该数被称为关键字,且以后的排序都不需要再移动该关键字,而是以关键字为分割线,将数组分为两部分,运用递归的方式对两部分重复上述操作,直至所有数排到正确位置上。所以一次排序后关键字的处理很重要,下述所有快排方法的每一次排序结束均与关键字的返回,此时还引出另一个问题,关键字该如何选取。

最初关键字都是选取当前排序范围最左边的数,然后从排序范围内的左边找比关键字第一个大的数字,从右边找比关键字小的第一个数字(注意此处是以排升序为例,应让用右边先动),让这两个交换位置,若左右指针未相遇,则继续重复该过程,最后所有比关键字小的排在关键字左边,比关键字的大的排在关键字右边。 在这之后再交换此时左指针指向的数和关键字,使得关键字位于中间。

关键字还可以通过随机数选取,但选出来后,仍然要放到排序范围的最左边,后续操作同上。仅需将选关键字并界定边界的部分替换成如下代码

 

关键字还可以三数取中法选取,但选出来后,仍然要放到排序范围的最左边,后续操作同上。

 

 

上述均为关键词选取的改进,从数据交换的角度还可以用挖坑法改进,其本质同上述代码并没有改变,只是在交换数据以进行排序时不再需要调用Swap()交换函数而是直接交换

上述算法本质均是通过左右指针,在一轮循环中让数组中的一个数排到其正确的位置,还可以通过前后指针法的思想,将小的数前移,大的数后推实现升序。注意该方法不是一次性就可以排好整个数组,仍是一次排好一个数,然后通过递归排好整个数组。  改种方法仍沿用递归的方式 ,但减少了每次排序的循环,且相比之前需要操控左右指针更好实现。

其实上述方法的递归流程图类似于二叉树,递归需要不断建立栈帧,深度过深时需要的空间会比较大 ,其实数据个数在小于一定程度后(此处假定数据量小于10),换用插入排序会在不影响效率的情况下节省空间。这被称为小区间优化

除了递归,应会改非递归   ,通过可将快排改为非递归,栈有先进后出的性质,向栈中按正确顺序压入边界值,再通过调用快排函数,完成排序后返回新的边界,再将新的边界压入栈,循环往复这个过程,可以替代递归调用。

4.归并排序的思想及其具体操作细节

  (1)递归的归并思想

       先对待排序的数组不断的以中线划分成两组,递归的进行划分,直至每组中只有一个数为止,该部分操作是分解,在这之后用分治的思想,分别对分解出来的几组数组从第一个元素开始进行比较,按照从小到大的顺序,两组两组的将已有序的数据合并,放入预先申请的动态区间中,最后用内存复制函数,将排好序的数据复制回原数组,覆盖原来无序的数据。 

(2)循环将递归改为非递归

  5.计数排序的思想及具体操作细节

数组的下标从0开始记,一直是从小到大连续变化且有序的,如果可以将需要排序的数字直接或间接当作数组中的下标,那么待排序的数字就有序了。此处需要统计待排序的数据中的每个数字的个数,然后依次朝数组中有几个放几个。

  

      

三、各种排序的性能及稳定性分析

排序算法的性能分析通常基于时间复杂度、空间复杂度、稳定性以及适应性等方面。以下是一些常见排序算法的性能分析:

1. **冒泡排序(Bubble Sort)**

    * 时间复杂度:O(n^2),其中n是待排序元素的数量。冒泡排序在最好和最坏的情况下都有相同的时间复杂度。
    * 空间复杂度:O(1),冒泡排序是一个原地排序算法,不需要额外的存储空间。
    * 稳定性:稳定
    * 适应性:对于已经部分排序的数据,冒泡排序的性能不佳。

2. **选择排序(Selection Sort)

    * 时间复杂度:O(n^2),选择排序在最好和最坏的情况下都有相同的时间复杂度。
    * 空间复杂度:O(1),选择排序也是一个原地排序算法
    * 稳定性:不稳定
    * 适应性:与冒泡排序相似,选择排序在处理已部分排序的数据时性能不佳。

3. **插入排序(Insertion Sort)**

    * 时间复杂度:O(n^2) 在最坏的情况下,O(n) 在最好的情况下(当输入数组已经排序时)
    * 空间复杂度:O(1),插入排序是原地排序
    * 稳定性:稳定
    * 适应性:对于小数据集或部分已排序的数据集,插入排序通常比其他O(n^2)算法(如冒泡排序和选择排序)更快。

4.**希尔排序**

1. **时间复杂度**:在最佳情况下,时间复杂度可以达到O(n),但最坏情况下仍可能为O(n^2)。希尔排序的性能很大程度上取决于增量序列的选取,不同的增量序列会导致不同的排序效果。常用的增量序列有N/2、Hibbard序列(Dk=2^k-1)等。

2. **空间复杂度**:希尔排序的空间复杂度为O(1),因为它是一个原地排序算法,不需要额外的存储空间。

3. **稳定性**:希尔排序是不稳定的排序算法。由于它采用分组和组内插入排序的方式,当相同关键字的记录被划分到不同的子表时,可能会改变它们之间的相对次序。

4. **适应性**:希尔排序算法仅适用于线性表为顺序存储的情况。它对于中等规模的数据集可能表现出较好的性能,但在处理大型数据集时,可能不如一些更高效的排序算法(如快速排序、归并排序等)表现得好。

4. **归并排序(Merge Sort)**

    * 时间复杂度:O(n log n),归并排序的时间复杂度始终相同,无论输入数据的初始状态如何。
    * 空间复杂度:O(n),归并排序需要额外的存储空间来合并子数组
    * 稳定性:稳定
    * 适应性:归并排序是一种分治算法,适用于大型数据集。

5. **快速排序(Quick Sort)**

    * 时间复杂度:平均情况下为O(n log n),最坏情况下为O(n^2)。快速排序的性能取决于所选的基准元素。
    * 空间复杂度:O(log n) 在平均和最好情况下O(n) 在最坏的情况下,这是由于递归调用栈所需的空间。然而,可以使用迭代方法减少空间复杂度到O(1)
    * 稳定性:不稳定
    * 适应性:快速排序是一种高效的排序算法,特别适用于大型数据集。

6. **堆排序(Heap Sort)**

    * 时间复杂度O(n log n),堆排序的时间复杂度始终相同,与输入数据的初始状态无关。
    * 空间复杂度:O(1),堆排序是原地排序,但需要额外的空间来维护堆结构(通常通过索引或指针实现)。
    * 稳定性:不稳定
    * 适应性:堆排序适用于大型数据集,并且在构建堆的过程中可以方便地找到最大或最小元素。

在选择排序算法时,需要根据具体的应用场景和需求来权衡各种因素。例如,对于小型数据集或需要稳定排序的情况,插入排序或冒泡排序可能是合适的选择;而对于大型数据集,归并排序、快速排序或堆排序可能更为高效。

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

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

相关文章

pytorch使用gpu训练模型

前言 仅记录学习过程,有问题欢迎讨论 因为网上博客参差不齐,我也踩了很多坑,留下我自己成功的经验哈哈。 1.安装CUDA和CUDNN 参考这个博客: https://blog.csdn.net/shdabai/article/details/131248257 2.安装gpu版本 pytorch …

【openlayers系统学习】3.6-3.7添加可视化选择器,手动选择可视化的图像源

六、添加可视化选择器(选择可视化的图像类型) 在前面的示例中,我们已经看到了同一Sentinel-2图像的真彩色合成、假彩色合成和NDVI渲染。如果能让用户从这些可视化中选择一个或更多,而不必每次都更改我们的代码,那就太…

【热门话题】一文带你读懂公司是如何知道张三在脉脉上发了“一句话”的

按理说呢,A公司和脉脉属于不同的平台,而且脉脉上大家可以匿名发言,所以,即便我坐在你边上,我发了一句话上去,你也不知道是谁发的。但通过一些技术,我们却可以分析出,公司是如何知道张…

Git远程控制

文章目录 1. 创建仓库1.1 Readme1.2 Issue1.3 Pull request 2. 远程仓库克隆3. 推送远程仓库4. 拉取远程仓库5. 配置Git.gitignore配置别名 使用GitHub可以,采用Gitee也行 1. 创建仓库 1.1 Readme Readme文件相当于这个仓库的说明书,gitee会初始化2两份…

docker容器安装nexus3以及nexus3备份迁移仓库数据

一、安装步骤 1.搜索nexus3镜像 docker search nexus3 2.拉取镜像 docker pull sonatype/nexus3或者指定版本 docker pull sonatype/nexus3:3.68.0 3.查看拉取的镜像 docker images | grep "nexus3" 4.启动nexus服务 直接启动 docker run -d --name nexus3 -…

基于Django框架深度学习口罩检测系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 随着全球疫情的蔓延,口罩成为了重要的防护工具。然而,在实际场景中&am…

MySQL —— 复合查询

一、基本的查询回顾练习 前面两章节整理了许多关于查询用到的语句和关键字,以及MySQL的内置函数,我们先用一些简单的查询练习去回顾之前的知识 1. 前提准备 同样是前面用到的用于测试的表格和数据,一张学生表和三张关于雇员信息表 雇员信息…

qt 布局学习笔记

目录 管理信息列表源码 c版: pro文件: qt 设置水平布局,里面有两个按钮,每个按钮就变的很宽,怎么设置按钮的精确位置 设置固定大小: 使用弹性空间(Spacer) 使用布局比例&…

Apache Doris 基础(一) -- Getting Started

Apache Doris 开源、实时数据仓库 Apache Doris是一个用于实时分析的现代数据仓库。 它提供大规模闪电般的实时数据分析。 实时获取和存储 在一秒钟内基于推的微批处理和基于拉的流数据获取。实时更新,追加和预聚合的存储引擎闪电般的查询 使用列式存储引擎、MPP架构…

vue3封装ElementUI plus Dialog弹窗

因为ElementuiPlus的dialog弹框的初始样式不太好看,而公司要求又要好看,本来是已经实现了,但是后来想想了发现封装完dialog的其他功能也要,所以特此记录一下 方案一 思路:封装一个组件,将所有新增的参数引入el-dialog 参数中,实现参数共用 新建一个组件,将官网暴露的属性全部引…

达梦数据库详解

达梦认证是指针对中国数据库管理系统(DBMS)厂商达梦公司所推出的数据库产品,即达梦数据库(DMDB),进行的一种官方认证体系。达梦认证旨在验证数据库管理人员对达梦数据库产品的掌握程度,及其在数…

【AD936X】 SDR 版图 欣赏

DIE : 4336x4730 um 的 65 nm 芯片 在顶部金属上,您可以看到 PLL 的电感器和日期代码 - 芯片在推出前两年就已准备就绪: 右下角是主数字块,应该是 128 抽头 FIR 滤波器。在最大放大倍率下,我们可以看到一排排标准单元。它们的放置…

[深度学习]基于yolov8+bytetrack+pyqt5实现车辆进出流量统计+车辆实时测速实现

以前使用过yolov5deepsort实现过车辆进出流量统计车辆实时测速,可以看我往期视频,这回改成yolov8bytetrack实现,实时性更好,原理和原来一样。车流量进出统计车速测量优点: 使用目标检测算法考虑bbox抖动,解…

绿联NAS DXP系列发布:内网穿透技术在私有云的应用分析

5月23日,绿联科技举行了“新一代存储方式未来已来”发布会,发布了绿联NAS私有云DXP系列(包括两盘位到八盘位的九款新品)以及由绿联科技自研的全新NAS系统UGOS Pro。此次绿联发布的DXP系列九款产品,共有两盘位、四盘位、…

Windows DNS 服务器配置转发器

DNS服务器转发器 在企业中由于自身条件的限制, 可能本身的DNS新能并不是很好,这个时候通过使用转发器功能, 将收到的DNS请求转发给另外一台高性能的DNS服务器,让其做后面的迭代查询。 1. 选择DNS服务器, 右击选择属性…

【LeetCode:496. 下一个更大元素 I + 单调栈】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

windows2008修改远程桌面端口,如何果断修改远程桌面端口,确保系统安全无忧!

在数字化时代的浪潮中,Windows 2008系统以其卓越的稳定性和可靠性,赢得了众多企业和个人的青睐。然而,随着网络安全问题的日益严峻,如何确保远程桌面连接的安全,成为了摆在我们面前的一道难题。今天,我将为…

MySQL的ODBC驱动下载、安装以及配置数据源

下载地址:odbc官方下载地址 MySQL :: Download Connector/ODBC 下载安装ODBC驱动 配置MySQL ODBC 数据源 进入控制面板->系统和安全->Windows工具 Data Source Name填写需要生成的ODBC数据源的名称。Description选填。如果使用远程数据库服务器&a…

我怎么使用AI大语言模型学英语

今天已经是我开始英语拉练任务的第39天了,一直在笃定的、雷打不动的、机械笨拙的重复做一件事,那就是使用AI工具,将我想要说的话翻译成英文,生成语音文件,每天朗读三小时,最终整个背下来。我也在思考&#…

使用分水岭算法进行图像分割

文章目录 理论代码 原文路径:opencv-4.6.0\doc\py_tutorials\py_imgproc\py_watershed 目标 在这一章当中, 我们将学习使用分水岭算法使用基于标记的图像分割我们将看到:cv.watershed() 理论 任何灰度图像都可以被视为地形表面,其中高强度…