数据结构 (36)各种排序方法的综合比较

news2024/12/12 21:57:25

一、常见排序方法分类

  1. 插入排序类

    • 直接插入排序:通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。
    • 希尔排序:是插入排序的一种改进版本,先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。
  2. 选择排序类

    • 简单选择排序:在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(或最大)元素,放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
    • 堆排序:利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质,即子节点的键值或索引总是小于(或者大于)它的父节点。
  3. 交换排序类

    • 冒泡排序:重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复进行的,直到没有再需要交换的元素为止。
    • 快速排序:选择一个基准元素,通过一趟排序将待排记录分隔成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。
  4. 归并排序

    原理:采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。
  5. 基数排序

    原理:一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。
  6. 计数排序

    原理:不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。

二、综合比较

  1. 时间复杂度

    • 冒泡排序、简单选择排序、直接插入排序:最坏情况下时间复杂度为O(n^2),适用于数据量较小的情况。
    • 希尔排序:时间复杂度依赖于增量序列的选择,但通常优于O(n^2)。
    • 快速排序:平均时间复杂度为O(n log n),但在最坏情况下(如数组已经有序)时间复杂度为O(n^2)。通过优化,如随机选择基准元素,可以降低最坏情况的发生概率。
    • 堆排序、归并排序:时间复杂度稳定为O(n log n),适用于数据量较大的情况。
    • 基数排序、计数排序:时间复杂度为O(n+k),其中k与数据的具体分布有关。基数排序适用于整数排序且数据位数较多的情况;计数排序适用于数据范围较小且为整数的情况。
  2. 空间复杂度

    • 冒泡排序、简单选择排序、直接插入排序:空间复杂度为O(1),即只需要常数级别的额外空间。
    • 希尔排序:空间复杂度为O(1),但实现时可能需要额外的数组来存储增量序列。
    • 快速排序:空间复杂度为O(log n),主要用于递归调用栈的空间开销。通过迭代实现可以降低空间复杂度,但可能增加代码复杂度。
    • 堆排序:空间复杂度为O(1),但需要额外的空间来维护堆结构(通常在原数组上进行操作)。
    • 归并排序:空间复杂度为O(n),需要额外的数组来存储合并后的结果。通过原地归并可以减少空间开销,但实现较为复杂。
    • 基数排序、计数排序:空间复杂度为O(n+k),其中k与数据的具体分布有关。需要额外的数组来存储桶或计数结果。
  3. 稳定性

    • 冒泡排序、直接插入排序、归并排序:稳定排序,即相等元素的相对顺序在排序前后保持不变。
    • 简单选择排序、快速排序、堆排序:不稳定排序,即相等元素的相对顺序可能会发生变化。
    • 希尔排序:不稳定排序,因为分组插入排序可能破坏相等元素的相对顺序。
    • 基数排序:稳定排序,因为每次分配和收集操作都保持相等元素的相对顺序。
    • 计数排序:稳定排序,因为计数和排序过程都保持相等元素的相对顺序。
  4. 适用场景

    • 数据量较小且对稳定性有要求时,可以选择冒泡排序、直接插入排序或归并排序。
    • 数据量较大且对空间复杂度有要求时,可以选择堆排序或快速排序(通过优化降低最坏情况的发生概率)。
    • 数据为整数且位数较多时,可以选择基数排序。
    • 数据范围较小且为整数时,可以选择计数排序。

 结语    

清醒时做事,糊涂时读书

大怒时睡觉,独处时思考

!!!

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

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

相关文章

SpringMVC全局异常处理

一、Java中的异常 定义:异常是程序在运行过程中出现的一些错误,使用面向对象思想把这些错误用类来描述,那么一旦产生一个错误,即创建某一个错误的对象,这个对象就是异常对象。 类型: 声明异常&#xff1…

【高中生讲机器学习】28. 集成学习之 Bagging 随机森林!

创建时间:2024-12-09 首发时间:2024-12-09 最后编辑时间:2024-12-09 作者:Geeker_LStar 嘿嘿,你好呀!我又来啦~~ 前面我们讲完了集成学习之 Boooooosting,这篇我们来看看集成学习的另一个分支…

springSecurity权限控制

权限控制:不同的用户可以使用不同的功能。 我们不能在前端判断用户权限来控制显示哪些按钮,因为这样,有人会获取该功能对应的接口,就不需要通过前端,直接发送请求实现功能了。所以需要在后端进行权限判断。&#xff0…

李飞飞的生成式3D场景,对数字孪生的未来影响几何?

大家好,我是日拱一卒的攻城师不浪,致力于技术与艺术的融合。这是2024年输出的第47/100篇文章。 前言 这两天,AI界的教母李飞飞团队重磅发布了空间智能生成式AI大模型。 仅通过一张图片就能够生成一个可操作和交互的3D空间场景。 空间智能的…

意图识别模型使用 基于BERT的对话意图和槽位联合识别 CPU运行BERT模型-亲测成功

意图识别模型使用 基于BERT的对话意图和槽位联合识别 CPU运行BERT模型-亲测成功 我们在开发AI-Agent智能体时,通常会使用提示词工程设置场景的带入,在实际项目中会有很多场景,如果所有提示词都放一起就会超过Token限制,则不得不拆…

OSG开发笔记(三十七):OSG基于windows平台msvc2017x64编译器官方稳定版本OSG3.4.1搭建环境并移植Demo

​若该文为原创文章,未经允许不得转载 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/144258047 各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究 长沙红胖子Qt…

《毛泽东思想和中国特色社会理论概述》课程报告Latex版本

所需要的图片: 源码(可运行): \documentclass[12pt]{article} \usepackage{ctex} \usepackage{graphicx} \usepackage{booktabs} \usepackage{titlesec} \usepackage{geometry} \usepackage{float} \usepackage{tabularx} \usepackage{enumitem} …

2024.12.6——攻防世界PHP2

知识点:目录扫描 代码审计 传参知识点补充: 后缀名为.phps的文件出现在无法使用web浏览器查看php源代码的情况下,.phps文件就是php的源代码文件,通常用于提供给用户(访问者)查看php代码,因为用…

OSI模型及各层缺陷

1.TCP/IP概述 (1)TCP/IP基本结构 TCP/IP是一组Internet协议,不但包括TCP和IP两个关键协议,还包括其他协议,如UDP、ARP、ICMP、Telnet和FTP等。TCP/IP的设计目标是使不同的网络互相连接,即实现互…

【论文阅读】Fifty Years of the ISCA: A Data-Driven Retrospective

学习体会: ISCA会议近五十年文章分析, 了解论文热点方向, 处理器依旧是热点! AI和并行是大趋势, 做XPU相关目前来说还是热点~ 摘录自原文 摘录: 数据来源和分析方法: 作者收集了 ACM 数字图书馆中所有 ISCA 论文,并使用 DBLP、Google Schol…

什么是MMD Maximum Mean Discrepancy 最大均值差异?

9多次在迁移学习看到了,居然还是Bernhard Schlkopf大佬的论文,仔细看看。 一.什么是MMD? 1. MMD要做什么? 判断两个样本(族)是不是来自于同一分布 2.怎么做?(直观上)…

LDR6500:音频双C支持,数字与模拟的完美结合

在当今数字化快速发展的时代,音频设备的兼容性和性能成为了用户关注的重点。LDR6500,作为乐得瑞科技精心研发的USB Power Delivery(PD)协议芯片,凭借其卓越的性能和广泛的应用兼容性,为音频设备领域带来了新…

Leetcode 每日一题 1.两数之和

目录 问题描述 示例 示例 1 示例 2 示例 3 提示 解决方案 算法思路 过题图片 代码实现 复杂度分析 注意事项 题目链接 结论 问题描述 给定一个整数数组 nums 和一个目标值 target,请你找出数组中和为目标值的那两个整数,并返回它们的数组下…

【萤火工场CEM5826-M11测评】Arduino 采集雷达模块数据与串口绘图

【萤火工场CEM5826-M11测评】Arduino 采集雷达模块数据与串口绘图 当采用串口输出模式时,雷达检测到运动时,则输出 v0.0km/h, str1234 字样; v 表示目标速度大小,str 表示信号强度; 当雷达检测不到目标时&#xff0c…

【C++】选择排 序算法分析与扩展

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯代码回顾💯选择排序的算法流程💯代码详解外层循环初始化最小值内层循环比较与更新元素交换 💯选择排序的特性时间复杂度空间复杂度稳定性…

3D 生成重建024-LGM第一个开源的3D生成大模型!

3D 生成重建024-LGM第一个开源的3D生成大模型 文章目录 0 论文工作1 论文方法2 实验效果 0 论文工作 这篇论文介绍了一种名为LGM(大型多视角高斯模型)的新方法,用于从单视角图像或文本提示生成高分辨率的三维内容。该方法的核心思想是双重的…

微信 创建小程序码-有数量限制

获取小程序码:小程序码为圆图,有数量限制。 目录 文档 接口地址 功能描述 注意事项 请求参数 对接 获取小程序码 调用获取 小程序码示例 总结 文档 接口地址 https://api.weixin.qq.com/wxa/getwxacode?access_tokenaccess_token 功能描述 …

日志基础示例python和c++

文章目录 0. 引言1. python2. c 0. 引言 本文主要记录python版本和c版本常用的日志基础示例。 1. python python版本常用的是logging库,结合colorlog库,可根据不同日志级别打印不同颜色的日志,为了便于分析问题,还添加了日志保…

泷羽sec学习打卡-brupsuite4

声明 学习视频来自B站UP主 泷羽sec,如涉及侵权马上删除文章 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都 与本人无关,切莫逾越法律红线,否则后果自负 关于brupsuite的那些事儿-proxy proxyInterceptHTTP history/WebSocket history(历史记录&a…

喜报!极限科技(INFINI Labs)通过国家高新技术企业认定

2024 年 10 月 29 日,国家高新技术企业认定管理工作网公示了北京市认定机构 2024 年认定报备的第一批高新技术企业备案名单,极限数据(北京)科技有限公司 顺利通过本次高新技术企业评审,并获得 国家级“高新技术企业”认…