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

一、常见排序方法分类

  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.mzph.cn/news/888980.shtml

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

相关文章

Datawhale AI冬令营 ——如何定制自己的专属大模型?

定制一个自己的专属大模型最方便的步骤 ≈ 指定数据集 开源大模型 微调平台(如讯飞星辰Maas) 内容很开门!very goo( ̄▽ ̄)d! 下面我将演示如何用讯飞星辰Maas平台甄嬛数据集构建Chat-嬛嬛。 …

03_Webpack模块打包工具

03_Webpack模块打包工具 目录 知识点自测 以下哪个选项是 ECMAScript 默认导出和导入的语法? A:export 和 require B:module.exports {} 和 import 变量名 C:export default 和 import 变量名 D:export 和 import {…

使用WebStorm开发Vue3项目

记录一下使用WebStorm开发Vu3项目时的配置 现在WebStorm可以个人免费使用啦!?? 基本配置 打包工具:Vite 前端框架:ElementPlus 开发语言:Vue3、TypeScript、Sass 代码检查:ESLint、Prettier IDE:WebSt…

阿里云 云产品流转(实现设备与小程序交互)

一、准备工作 1、设备接入平台 创建两个设备接入到对应产品中,具体可以参考这里(点击跳转)。 二、云产品流转设置 在物联网平台下-->消息转发-->云产品流转->数据源 1、数据源 数据源-->创建数据源-->填写信息-->确定&…

【AIGC】如何获取ChatGPT外部GPTs应用的提示词Prompt指令和知识库文件

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | GPTs应用实例 文章目录 💯前言💯获取GPTs的提示词Prompt指令💯获取GPTs的知识库文件💯小结 关于GPTs指令如何在ChatGPT上使用,请看这篇文章&#xff…

沐风老师3DMAX摄相机阵列插件使用方法

3DMAX摄相机阵列插件,从网格对象或样条线的顶点法线快速创建摄相机阵列。该插件从网格的顶点或样条线的节点获取每个摄影机的位置和方向。 3DMAX摄相机阵列插件支持目前3dMax主流的物理相机、标准相机、VRay物理相机。 【版本要求】 3dMax 2015及更高版本 【安装方…

BMC VPD格式定义

1.说明 目前遇到有2种格式的VPD定义方式,特记录并分享出来。 本节可参考链接下载文件: https://gitee.com/wit_yuan/fru 2.参考PCI_Express_Base_6.0a.pdf 应用范围: 例如常见的定制raid卡,Hba卡采用的储存serial number等。 3.参考platform-manag…

4K高清壁纸网站推荐

1. Awesome Wallpapers 官网: https://4kwallpapers.com/ 主题: 创意、摄影、人物、动漫、绘画、视觉 分辨率: 4K Awesome Wallpapers 提供了丰富的高质量图片,分为通用、动漫、人物三大类,可以按屏幕比例和分辨率检索,满足你对壁纸的各种…

小迪笔记 第四十五天 sql 注入进阶 :二次注入,堆叠注入,数据读取(load_file)加外带

二次注入 概念:就是我们注入的语句(刚注入时 不会产生影响)但是我们的恶意代码会进入数据库 他在被二次利用的时候就会进行执行 这个就是二次注入 这个的典型案例就是账号密码的修改 : 大家应该也知道 账号注册一般是禁止你使…

[C++]继承

继承 概念使用方法继承方式子类的构造与析构 继承的成员继承成员在子类对象里的存放顺序成员变量普通成员变量静态成员变量 成员函数普通成员函数重定义(隐藏) 静态成员函数友元函数 单继承与多继承概念赋值转换(切片)多继承带来的…

机器人构建详解:售前售后服务客服机器人与广告生成机器人的微调数据处理方法

引言 大模型(如BERT、GPT等)在自然语言处理任务中展现了强大的能力,但为了使其更贴合特定应用场景,通常需要进行微调。本文将详细讲解如何为售前售后服务的客服机器人和广告生成机器人准备高质量的微调数据,并通过具体…

8.解决跨域问题的三种方案

开启域名,单点登录后,就使用最上面的接口了

全解:Redis RDB持久化和AOF持久化

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…

使用 ASP.NET Core HttpLoggingMiddleware 记录 http 请求/响应

我们发布了一个应用程序,该应用程序运行在一个相当隐蔽的 WAF 后面。他们向我们保证,他们的产品不会以任何方式干扰我们的应用程序。这是错误的。他们删除了我们几乎所有的“自定义”标头。为了“证明”这一点,我构建了一个中间件&#xff0c…

回调机制详解

一、什么是回调: 回调是一种双向的调用模式,程序模块之间通过这样的接口调用完成通信联系,回调的核心就是回调方将本身即this传递给调用方,这样调用方就可以在调用完毕之后再告诉回调方它想要知道的信息。 回调函数用于层间协作&…

CUDA 计时功能,记录GPU程序/函数耗时,cudaEventCreate,cudaEventRecord,cudaEventElapsedTime

为了测试GPU函数的耗时,可以使用 CUDA 提供的计时功能:cudaEventCreate, cudaEventRecord, 和 cudaEventElapsedTime。这些函数可以帮助你测量某个 CUDA 操作(如设置设备)所花费的时间。 一、记录耗时案例 以下是一个示例程序&a…

异步操作,promise、axios

一、异步操作(异步编程)、同步操作 异步操作是指在编程中,某个任务的执行不会立即完成,同时不会阻塞后续代码的执行。在异步操作中,程序可以继续运行,并在异步任务完成时得到通知并处理结果。这与同步操作…

Ansible的yum和saltstack的哪个功能相似

Ansible的yum和saltstack的哪个功能相似 在 Ansible 和 SaltStack 中,Ansible 的 yum 模块 和 SaltStack 的 pkg 模块 功能相似。它们都用于管理软件包,支持安装、升级、删除和查询等操作。 Ansible 的 yum 模块 用途: 专门用于基于 Red Hat …

JVM 面试题相关总结

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/literature?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,…

基于BiLSTM-CRF的中文电子病历命名实体识别

声明:博客未经允许禁止抄袭转载。 前言 最近有粉丝在后台私信我能不能更一篇关于命名实体识别(NER,Named Entity Recognition)的经典模型BiLSTM-CRF的实战文章,前段时间有点忙所有一直没有更新,趁着最近有点空,满足一…