数据结构学习笔记—— 排序算法总结【ヾ(≧▽≦*)o所有的排序算法考点看这一篇你就懂啦!!!】

目录

  • 一、排序算法总结
    • (一)排序算法分类
    • (二)表格比较
  • 二、详细分析(最重要考点!!!)
    • (一)稳定性
    • (二)时间复杂度
    • (三)空间复杂度
    • (四)比较次数
    • (五)平均比较次数
    • (六)排序趟数
    • (七)根据规模选择排序算法
    • (八)每趟确定的元素最终位置
    • (九)存储方式的选择

一、排序算法总结

常用排序算法如下:

排序算法
插入排序
直接插入排序
折半插入排序
希尔排序
选择排序
简单选择排序
堆排序
交换排序
冒泡排序
快速排序
归并排序
基数排序

(一)排序算法分类

根据所要排序的元素是否完全在内存中进行排序,可分为以下两种:

名称特点
内部排序(In-place)排序的元素完全在内存中
外部排序(Out-place)在排序过程中不断在内、外存之间交换

其中归并排序基数排序是外部排序,其它均为内部排序。

(二)表格比较

共五大类九种排序算法,插入类可分为直接插入、折半插入和希尔排序,交换类可分为冒泡排序和快速排序,选择类可分为简单选择和堆排序,以及剩下的归并排序与基数排序。
在这里插入图片描述

二、详细分析(最重要考点!!!)

(一)稳定性

  • 插入排序(直接/折半)、冒泡排序、归并排序和基数排序是稳定的排序算法,其中平均时间复杂度为O(nlog2n)的稳定排序只有归并排序
稳定
插入
除了希尔
交换
除了快速
选择
除了简单选择
归并
基数
  • 对于插入交换选择三大类的排序算法,较简单型的排序算法一般都是稳定的(除了希尔排序、快速排序、简单选择排序)。
  • 较复杂型的排序算法都是不稳定的,排序中元素的相对位置会发生变化,例如希尔排序、快速排序、堆排序,另外,还有简单选择排序。
不稳定
希尔
快速
简单选择
堆排序

(二)时间复杂度

  • 由于直接/折半插入排序、简单选择排序、冒泡排序是较简单型的排序算法,其算法实现过程较简单,时间复杂度均为O(n2),但在最好情况下折半插入排序可以达到O(nlog2n),直接插入排序冒泡排序可以达到O(n),但简单选择排序中元素的比较次数与序列的初始状态无关,所以其时间复杂度始终为O(n2);另外,这四种较简单型的排序算法的空间复杂度均为O(1)。
排序算法空间复杂度平均时间复杂度最好时间复杂度最坏时间复杂度
直接插入排序O(1)O(n2)O(n)O(n2)
折半插入排序O(1)O(n2)O(nlog2n)O(n2)
冒泡排序O(1)O(n2)O(n)O(n2)
简单选择排序O(1)O(n2)O(n2)O(n2)

  • 希尔排序也称为缩小增量排序,它属于插入类算法,是插入排序的拓展,由于时间复杂度上有较大的改进,所以对较大规模的排序可以达到很高的效率,但无法得出较精确的渐进时间;希尔排序的空间复杂度也为O(1)。
排序算法空间复杂度平均时间复杂度最好时间复杂度最坏时间复杂度
希尔排序O(1)依赖于增量序列依赖于增量序列依赖于增量序列

  • 快速排序、堆排序和归并排序是改进型的排序算法,其平均时间复杂度均为O(nlog2n),快速排序和归并排序都采用分治的思想,而堆排序是通过使用这种数据结构。
排序算法平均时间复杂度最好时间复杂度最坏时间复杂度
快速排序O(nlog2n)O(nlog2n)O(n2)
堆排序O(nlog2n)O(nlog2n)O(nlog2n)
归并排序O(nlog2n)O(nlog2n)O(nlog2n)
  • 快速排序的初始序列为有序或逆序时,为最坏情况,时间复杂度会达到O(n2),而初始序列越接近无序或基本上无序时,为最好情况,即时间复杂度为O(nlog2n);归并排序中,比较次数与初始序列无关,即分割子序列与初始序列是无关的;堆排序中初始建堆的时间复杂度为O(n),每下坠一层最多只需对比元素两次,每一趟不超过O(h)=O(log2n),所以归并排序和堆排序的最好、最坏时间复杂度都为O(nlog2n) 。

(三)空间复杂度

  • 快速排序中需借助来进行递归,其空间复杂度与递归层数(栈的深度)有关,最坏情况下二叉树为最大高度,为n层,即最大递归深度,空间复杂度为O(n),最好情况下二叉树为最小高度,为⌊ log2n ⌋,即最小递归深度,空间复杂度为O(log2n),堆排序只需借助常数个辅助空间,空间复杂度为O(1) ,归并排序中也用到了,其递归工作栈的空间复杂度为O(log2n),由于另外还需用到辅助数组,其空间复杂度为O(n),所以该排序算法的空间复杂度为O(n)。
排序算法空间复杂度平均时间复杂度最好时间复杂度最坏时间复杂度
快速排序最好为O(log2n);最坏为O(n);平均情况下,为O(log2n)O(nlog2n)O(nlog2n)O(n2)
堆排序O(1)O(nlog2n)O(nlog2n)O(nlog2n)
归并排序O(n)O(nlog2n)O(nlog2n)O(nlog2n)

(四)比较次数

  • 二路归并排序简单选择排序基数排序的比较次数都与初始序列的状态无关。

(五)平均比较次数

  • 在插入排序、希尔排序、选择排序、快速排序、堆排序、归并排序和基数排序中,平均比较次数最少的排序是快速排序

  • 直接插入排序和简单选择排序对比:通常情况下,直接插入排序每趟插入都需向后一次挪位,而简单选择排序只需找到最小/最大元素与其交换位置即可,它的移动次数较少。

考虑在较极端情况下,对于有序数组,直接插入排序的比较次数为n-1;而简单选择排序的比较次数始终为n(n-1)/2。

(六)排序趟数

  • 直接插入排序、简单选择排序和基数排序的排序趟数与初始序列无关
    (1)直接插入排序由于每趟都插入一个元素至已排好的子序列,所以排序趟数固定为n-1次;
    (2)简单选择排序中,每趟排序都选出一个最小/最大的元素,所以排序趟数也固定为n-1次;
    (3)基数排序需进行d趟分配和收集操作。

(七)根据规模选择排序算法

  • 一般来说,对于要排序元素较多的序列,可以选用时间复杂度为O(nlog2n)的堆排序、快速排序和归并排序算法,其中快速排序是目前基于比较的内部排序中最好的排序算法,但它要求初始序列随机分布这样才会使快速排序的平均时间最短。堆排序的空间复杂度小于快速排序,它不会出现快速排序中的最坏情况。前两种排序算法都是不稳定的,因此若要选择时间复杂度为O(nlog2n)且稳定的排序算法,即可以选择归并排序,通过将该算法与直接插入排序结合起来,即通过直接插入排序求得有序子序列后,再合并,这样的归并算法依旧是稳定的。

  • 若要排序元素很大,记录的元素位数较少时,应选用基数排序,它适用于以下:
1、数据元素的关键字可以很容易地进行拆分成d组,且d较小;
2、每组关键字的取值范围不大,即r较小;
3、数据元素个数n较大。

  • 对于排序元素个数较少的序列,可以选用时间复杂度为O(n2)的直接/折半插入排序、冒泡排序、简单选择排序算法,由于简单选择排序的移动次数比直接插入排序少,所以当元素信息量较大时,应选用简单选择排序。

(八)每趟确定的元素最终位置

每一趟排序算法的进行都能确定一个元素处于其最终位置的排序算法有以下:

①冒泡排序
②简单选择排序
③堆排序
④快速排序前三者能形成整体有序的子序列,而快速排序只确定枢轴元素的最终位置
(第n趟快速排序完成时,会有n个以上的元素处于其最终结果位置上,
即它们两边的元素分别比它大或小)。

(九)存储方式的选择

  • 插入类只有折半插入希尔排序、交换类只有快速排序、选择类只有堆排序都只适用于顺序存储,而基数排序只适用于链式存储,其他排序算法都可以支持顺序存储和链式存储,例如直接插入、冒泡排序、简单选择排序和归并排序。
    在这里插入图片描述

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

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

相关文章

MapRdeuce工作原理

hadoop - (三)通俗易懂地理解MapReduce的工作原理 - 个人文章 - SegmentFault 思否 MapReduce架构 MapReduce执行过程 Map和Reduce工作流程 (input) ->map-> ->combine-> ->reduce-> (output) Map: Reduce

通讯协议介绍CoAP 协议解析

目录 1 通讯协议 2 TCP/IP 网络模型 2.1 TCP协议 2.1.1 TCP 连接过程 2.1.2 TCP 断开连接 2.1.3 TCP协议特点 2.2 UDP协议 2.2.1 UDP 协议特点 3 应用层协议简介 3.1 HTTP 协议 3.2 CoAP 协议 3.3 MQTT 协议 4 CoAP 协议详解 4.1 REST 风格 4.2 CoAP 首部分析 4…

Python 判断三位水仙花数

"""判断是否为三位水仙花数知识点:0、水仙花满足条件:(1 ** 3) (5 ** 3) (3 ** 3) 1531、字符串索引,例如:name zhouhua name[0] z2、变量类型转换函数3、双目运算符幂**,例如:3 ** 2 3 * 3 94、…

功能基础篇2——常用哈希和加密算法介绍及Python相关库与实现

加解密 https://docs.python.org/3/library/crypto.html 三方库推荐,https://cryptography.io/en/latest/ Criptography,https://pypi.org/project/cryptography/ PyCryptodome,a fork of PyCrypto,https://pypi.org/project/…

【笔记】ubuntu 20.04 + mongodb 4.4.14定时增量备份脚本

环境 ubuntu 20.04mongodb 4.4.14还没实际使用(20230922)后续到10月底如果有问题会修改 原理 只会在有新增数据时生成新的备份日期目录备份恢复时,如果恢复的数据库未删除,则会覆盖数据 准备 准备一个文件夹,用于…

Centos 7 部署SVN服务器

一、安装SVN 1、安装Subversion sudo yum -y install subversion2、验证是否安装成功(查看svn版本号) svnserve --version二、创建版本库 1、先建立目录,目录位置可修改 mkdir -p /var/svn cd /var/svn2、创建版本库,添加权限…

Unity工具——LightTransition(光照过渡)

需求描述 在游戏中,开发者为了让玩家更直接地看到待拾取的物品从而为其添加一种闪烁效果,或者模拟现实中闪烁的灯光效果,我能够想到的一种方案则是通过控制光照强度来实现,那么本篇文章我们就尝试通过这个方案来实现一下&#xff…

什么是Vue的Vetur插件?它有哪些功能

引言 在现代前端开发中,Vue.js已经成为了一个备受欢迎的JavaScript框架。随着Vue.js的流行,开发人员需要强大的工具来提高他们的生产力和Vue.js项目的质量。Vetur插件是一个为Vue.js开发者提供的强大工具,它不仅提供了丰富的功能&#xff0c…

vue框架实现表情打分效果

本来今天要实现这个功能 但是在网上查了一下 就csdn上有一个符合要求的 但是他竟然收费,痛心疾首啊 太伤白嫖党的心的 所以我手写了一个这个类似功能的代码 希望能帮到有这个需求的同学们 技术栈是VUE3 用其他技术栈的也可以看 因为逻辑很简单都一样的 // 问卷的虚拟数据 con…

前端框架vBean admin

文章目录 引言I 数据库表设计1.1 用户表1.2 角色表1.3 菜单表II 接口引言 文档:https://doc.vvbin.cn/guide/introduction.html http://doc.vvbin.cn 仓库:https://github.com/vbenjs/vue-vben-admin git clone https://github.com/vbenjs/vue-vben-admin-doc 在线体验demo:…

步步为营,如何将GOlang引用库的安全漏洞修干净

文章目录 引场景构建第一步、直接引用的第三方库升级修复策略1.确认是否为直接引用的第三方库2.找到需要升级的版本是否为release版本 第二步、间接引用的第三方库升级修复策略那么问题来了,我们这么间接引用库的对应的直接引用库是哪个呢? (…

Hadoop NameNode执行命令工作流程

Hadoop NameNode执行命令工作流程 客户端API或者CLI与NameNode的交互命令数据的格式(1) 预处理流程(2) 创建NameNode与NameNodePrcServer流程(3) HDFS API以及CLI的命令到NameNode的工作执行流程(4) 执行命令的参数流动 客户端API或者CLI与NameNode的交互命令数据的格式 hadoop…

Apache 原生 Hadoop 运维命令

Hadoop 1、检查原生hadoop和压缩库是否可用 hadoop checknative2、打印hadoop环境的配置路径 hadoop classpathHDFS 1、查看hdfs文件系统的状态 hdfs dfsadmin -report2、获取安全模式的状态 hdfs dfsadmin -safemode get安全模式下只可进行读操作 3、文件系统健康检查 …

LeetCode_拓扑排序_困难_2603.收集树中金币

目录 1.题目2.思路3.代码实现(Java) 1.题目 给你一个 n 个节点的无向无根树,节点编号从 0 到 n - 1 。给你整数 n 和一个长度为 n - 1 的二维整数数组 edges ,其中 edges[i] [ai, bi] 表示树中节点 ai 和 bi 之间有一条边。再给…

10分钟设置免费海外远程桌面

前言 本教程将向您介绍如何使用 Amazon Lightsail 服务的免费套餐轻松搭建属于您的远程桌面。依托于 Amazon 全球可用区,您可以在世界各地搭建符合您配置需求的远程桌面。 本教程需要先拥有亚马逊云科技海外账户。现在注册亚马逊云科技账户可以享受12个月免费套餐…

《向量数据库指南》——文心大模型+Milvus向量数据库搭建AI原生应用

亲爱的科技探险家们和代码魔法师们: 未来的钟声已经敲响,预示着一场极度炫酷的虚拟现实游戏即将展开。从初期简单的智能识别,到设计师级别的图纸设计,生成式AI技术(Generative AI)以其独特理念和创新模式重塑了传统内容生产效率和交互模式,在无数领域展现着非凡的才华。…

清易低功耗智能雨量监测站概述

一、低功耗智能雨量监测站概述产品概述 低功耗智能雨量监测站基于智能传感、无线通信、智能处理与智能控制等物联网技术的开发,利用智能传感技术,通过传感器测量降雨量,并使用物联网进行传输。无需专门的通信线路,在联网的状态下…

简单的手机电脑无线传输方案@固定android生成ftp的IP地址(android@windows)

文章目录 abstractwindows浏览android文件环境准备客户端软件无线网络链接步骤其他方法 手机浏览电脑文件公网局域网everythingpython http.server 高级:固定android设备IP准备检查模块是否生效 windows 访问ftp服务器快捷方式命令行方式双击启动方式普通快捷方式映射新的网络位…

zabbix网络管理安装教程

安装: apt install zabbix-server-mysql zabbix-frontend-php zabbix-nginx-conf zabbix-sql-scripts zabbix-agent 参考资源: 官网: 下载: 其它: 常用指令: 目标与应用价值: 部署难点&#…

【php经典算法】冒泡排序,冒泡排序原理,冒泡排序执行逻辑,执行过程,执行结果 代码

冒泡排序原理 每次比较两个相邻的元素,将较大的元素交换至右端 冒泡排序执行过程输出效果 冒泡排序实现思路 每次冒泡排序操作都会将相邻的两个元素进行比较,看是否满足大小关系要求,如果不满足,就交换这两个相邻元素的次序&…