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

news2024/11/18 16:30:06

目录

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

一、排序算法总结

常用排序算法如下:

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

(一)排序算法分类

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

名称特点
内部排序(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.coloradmin.cn/o/1019892.html

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

相关文章

数据结构与算法(三)——递归

一、递归的概念 递归就是方法自己调用自己,每次调用时传入不同的变量。 递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。 1.1 递归机制 递归调用规则: 1>当程序执行到一个方法时,就会开辟一个独立的空间&#xff0…

软件测试技术之地图导航的测试用例

外观测试 屏幕显示不能有花屏、黑点和闪屏,清晰度、亮度、颜色要正常。 检测所有按键都能起到相应作用,是否手感不良。 UI显示状态、颜色、清晰度、效果。 控制:放大,缩小,音量调节功能测试。 交叉路口查询测试&am…

无涯教程-JavaScript - MULTINOMIAL函数

描述 MULTINOMIAL函数返回值之和的阶乘与阶乘积之比。 语法 MULTINOMIAL (number1, [number2] ...)争论 Argument描述Required/OptionalNumber11 to 255 values for which you want the multinomial.Requirednumber2, ...Optional Notes 多项式为- $$MULTINOMIAL\left(a_…

插件化原理

插件化技术和热修复技术都属于动态加载,从普及率的角度来看,插件化技术还没有热修复的普及率高,主要原因是占大多数的中小型应用很少也没有必要去采用插件化技术。 Android P preview(Android 9)开始限制调用隐藏 API…

在qml中将一个16进制表示的颜色加上透明度

在qml中,我们在指定控件的颜色时,可以直接通过16进制的字符串来表示,比如"#ff0000"; 这种方式也比较符合UI设计人员的使用习惯。 但是假如要在此颜色的基础上,加个透明度的话,就要重新计算一番,比…

Nginx学习记录一揽子:学会配置Nginx

前言 在配置我的网站的过程中,深觉自己功力尚浅,不由黯然伤神,遂有奋进之意,针对这个过程中的不自然优雅的操作,得加强学习。在配置整个虚拟网络的过程中,由于对Nginx的了解不深,使用起来也捉襟…

LeetCode 周赛上分之旅 #46 经典二分答案与质因数分解

⭐️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度…

C++ 算法学习 之 string find

这里写目录标题 String的查找方法 find使用:返回值:输出结果 更多string方法 参考于 c手册 String的查找方法 find 使用: std::string str ("There are two needles in this haystack with needles."); std::string str2 ("…

Pytorch搭建循环神经网络RNN(简单实战)

Pytorch搭建循环神经网络RNN(简单实战) 去年写了篇《循环神经网络》,里面主要介绍了循环神经网络的结构与Tensorflow实现。而本篇博客主要介绍基于Pytorch搭建RNN。 通过Sin预测Cos import torch import torch.nn as nn import numpy as np from matp…

医学影像相关开源数据集资源汇总

CT 医学图像 下载链接:http://suo.nz/2tQehH 该数据集旨在允许测试不同的方法来检查与使用对比度和患者年龄相关的 CT 图像数据的趋势。基本思想是识别与这些特征密切相关的图像纹理、统计模式和特征,并可能构建简单的工具,在这些图像被错误…

MyEclipse项目导入与导出

一、项目导出 1、右键选择项目名称,弹出菜单中选择“export”,如下图所示 2、选择“恶心“export”,弹出菜单如下;在“General“选项中,选择“File System”选项 3、点击“next”,进入保存位置选择界面&am…

异步FIFO设计的仿真与综合技术(5)

概述 本文主体翻译自C. E. Cummings and S. Design, “Simulation and Synthesis Techniques for Asynchronous FIFO Design 一文,添加了笔者的个人理解与注释,文中蓝色部分为笔者注或意译。前文链接: 异步FIFO设计的仿真与综合技术&#xf…

小目标检测高效解决方案汇总,附19篇原论文&开源代码

目标检测发展至今,涌现出了许多非常实用的方法,但在小目标检测领域, 由于小目标经常存在图片模糊、信息少、分辨率低等问题,性能水平仍然难以提升。 不过在近几年间,已经有许多有效的解决方法被提出,我今天…

前端录入音频并上传

目录 纯 js 实现(有问题)使用插件 recorder-core (没问题) 纯 js 实现(有问题) 上传音频文件时 blob 数据中 size 一直是0,导致上传之后音频不可播放(本地录制后本地是可以播放的&am…

什么是CORS(跨源资源共享)?如何解决前端中的CORS问题?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ CORS(跨源资源共享)⭐ 解决前端中的CORS问题的方法⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为…

【前端知识】Three 学习日志(三)—— 光源对物体表面的影响

Three 学习日志(三)—— 光源对物体表面的影响 一、设置材质为受光照影响 //MeshLambertMaterial受光照影响 const material new THREE.MeshLambertMaterial();此时,场景中一片漆黑,无法看到原来的物体,需要设置光源…

24v转5v稳压芯片-5A大电流输出ic

这款24V转5V5A汽车充电芯片具有以下特性和参数: - 宽输入电压范围:4.5V至36V - 最大输出电流:5.0A - 高达92%的转换效率 - 恒流/恒压模式控制 - 最大占空比100% - 可调输出电压 - 2%的输出电压精度 - 集成40mΩ高侧开关 - 集成18mΩ低侧开关 …

网络安全深入学习第六课——热门框架漏洞(RCE— Weblogic反序列化漏洞)

文章目录 一、Weblogic介绍二、Weblogic反序列化漏洞历史三、Weblogic框架特征1、404界面2、登录界面 四、weblogic常用弱口令账号密码五、Weblogic漏洞介绍六、Weblogic漏洞手工复现1、获取账号密码,这是一个任意文件读取的漏洞1)读取SerializedSystemI…

K8s(Kubernetes)学习(六)——Ingress

第六章 Ingress 什么是 IngressIngress 和 Service 区别Ingress 控制器 Traefik 使用Ingress Route的定义 1 简介 https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/ Ingress 是一种 Kubernetes 资源类型,它允许在 Kubernetes 集群中暴露…

浏览器报错内容:Provisional headers are shown

浏览器报错内容:Provisional headers are shown 如下图: 解决方法:nginx 443 启用HTTP/2模式,如下图: server {listen 443 ssl http2;server_name callcenterda.umworks.com;client_max_body_size 200M;ssl_session_…