排序算法——人无完人

        没有哪一个排序方法是完美的,对于不同的需求,排序算法各有自己的优势。金无足赤,人无完人。

(这里不再重复所讲排序算法的实现,网上已有很多好的教学。)


        排序方法除了依靠时间复杂度空间复杂度来区分,排序算法还有内部和外部之分、稳定与非稳定之分、交互与非交互之分,其中时间和空间复杂度还受储存方式的影响(如顺序表、链表等),比较次数与初态也有关系等等。

        首先我们来介绍一下内部排序和外部排序:

 内部排序和外部排序

        内部排序和外部排序的主要区别在于数据存储位置和数据量大小,在实际应用中,选择哪种排序方式取决于数据量的大小和硬件资源的限制。

        内部排序是指所有待排序的数据可以一次性加载到内存中进行排序。适用于数据量较小、内存足够容纳全部数据的场景。外部排序是指待排序的数据量太大,无法一次性加载到内存中,需要借助外部存储(如磁盘)进行排序。适用于数据量远大于内存容量的场景。

        常见的排序算法如冒泡排序(Bubble Sort)、选择排序(Selection Sort)、插入排序(Insertion Sort)、快速排序(Quick Sort)、归并排序(Merge Sort)、堆排序(Heap Sort)、希尔排序(Shell Sort)都是内部排序。

稳定与非稳定性

          根据排序前后相同关键字的相对位置是否发生变化,把排序分为稳定和不稳定两类。

        多关键字排序 即需要根据多个条件进行排序时,排序时先按第一个关键字排序,如果第一个关键字相同,再按第二个关键字排序,以此类推。。稳定排序保证在第二关键字排序时,第一关键字的顺序不会被破坏。

        假设有以下学生数据:

        我们要求,先按分数进行降序排序,如果分数相同,再按“年龄”升序排序。

  1. 按“分数”降序排序:

    • 李四(90分)、赵六(90分)、张三(85分)、王五(85分)。

  2. 对分数相同的记录,按“年龄”升序排序:

    • 李四(22)、赵六(21)、张三(20)、王五(20)。

        在数据库查询中,先按“姓名”排序,再按“年龄”排序。如果排序算法不稳定,可能会导致相同年龄的记录中,姓名的顺序混乱。同样在事件驱动系统中,事件可能需要按时间戳排序,同时保持相同时间戳的事件的原始顺序等,排序算法的稳定性也有很大的影响。


 交互与非交互性

        交互排序是指在排序过程中需要用户参与或实时交互的排序方式。排序的每一步都可能依赖于用户的输入或反馈。非交互排序就是指在排序过程中不需要用户参与,排序算法独立完成所有操作。排序结果在排序过程结束后一次性输出。

        显然,交互排序需求更多,复杂度也就更高,在需要用户反馈、评分的推荐系统、或者是交互式数据可视化、调查或投票等,交互排序肯定更好;但在批量数据处理、文件排序、科学计算或者离线数据分析这些不需要用户参与的排序中,非交互排序更好。

内部排序方法  

        我们这里主要介绍一下内部排序方法,  根据排列所依据的策略不同,排序可以分为插入、选择、交换、分配和归并方法。

 插入类

        插入排序(Insertion Sort)的基本思想是将数组分为已排序部分和未排序部分,逐个将未排序部分的元素插入到已排序部分的正确位置。基于这个思想,如果初态基本有序,那么比较次数就会越少。

        可以选择不同的方式在已排好的记录中寻找插入位置,根据查找方式不同,有多种插入排序方法,如直接插入排序、折半插入排序、希尔排序。 


选择类

        选择排序(Selection Sort)基本思想是每次从未排序部分选择最小(或最大)的元素,放到已排序部分的末尾。

        简单选择排序和堆排序就是选择类。


归并类

        归并排序(Merge Sort)基本思想是采用分治法,将数组分成两半分别排序,然后将排序后的两部分合并。其中2-路归并排序和折半查找法像是一个思想的相反应用。


交换类

        交换排序(Exchange Sort)基本思想是通过交换相邻元素的位置来排序,典型的例子是冒泡排序。我们熟知的冒泡排序和快速排序就是交换类。


分配类 

        前述各类排序方法都建立在关键字比较的基础上,而分配类排序不需要比较关键字的大小,它是根据关键字中各位的值,通过对待排序记录进行若干躺“分配”与“收集”来实现排序的,是一种借助于多关键字排序的思想对但关键字进行排序的方法。其中计数排序、桶排序和基数排序是典型的分配类排序。     

总结

        正如标题所说,每个排序算法都各有优势,我们没办法直接说那个算法最好,针对与不同的场景,用到的算法也不同,金无赤足,人无完人,排序算法也一样。

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

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

相关文章

3D模型可视化引擎HOOPS Visualize在桌面端的支持有哪些特点?

在数字化转型日益加速的今天,工业和工程领域的专业人员面临着越来越复杂的设计和数据分析需求。3D模型可视化技术应运而生,并成为了加速设计和制造流程的关键工具。作为业界领先的3D可视化引擎之一,HOOPS Visualize提供了一系列强大的桌面端支…

傅里叶变换推导

基本模型 假设在二维直角坐标系中,可以用相互垂直的基向量和表示: 假设: 假设在上的投影为,那么: 所以: 用公式表达: 但是在实际中,基向量和不一定长度都是1,重新推导一…

数据科学之数据管理|python for office

现如今,随着计算机的逐渐普及。现代化办公成为每个职场人必备的技能,本文档就来介绍,如何使用pytohn实现自动化办公。然而,自动化办公有时并不能减少工作量。自动化办公更适合批量处理文档。单一的文件,小金不建议使用…

【前端框架】Vue3 中 `setup` 函数的作用和使用方式

在 Vue 3 里,setup 函数是组合式 API 的核心入口,为开发者提供了更灵活、高效的组件逻辑组织方式。以下为你详细介绍其作用和使用方式: 作用 1. 初始化响应式数据 在 setup 函数中,我们能够使用 ref 和 reactive 等函数来创建响…

MySQL无法连接到本地localhost的解决办法2024.11.8

问题描述:我的MySQL可以远程连接服务器,但无法连接自己的localhost。 错误提示: 2003 - Cant connet to MySQL server on localhost(10061 "Unknown error")查找问题原因: 1. 检查环境变量是否正确:发现没…

STM32HAL库快速入门教程——常用外设学习(2)

目录 一、STM32HAL库开发(8)——CubeMX配置DMA 1.1、什么是DMA? 1.2、内存内存之间的传输(单次) ​编辑 1.3、内存外设之间的传输(ADC) 二、STM32HAL库开发(9)——…

LabVIEW与小众设备集成

在LabVIEW开发中,当面临控制如布鲁克OPUS红外光谱仪这类小众专业设备的需求,而厂家虽然提供了配套软件,但由于系统中还需要控制其他设备且不能使用厂商的软件时,必须依赖特定方法通过LabVIEW实现设备的控制。开发过程中&#xff0…

PyQt组态软件 拖拽设计界面测试

PyQt组态软件测试 最近在研究PyQt,尝试写个拖拽设计界面的组态软件,目前实现的功能如下: 支持拖入控件,鼠标拖动控件位置 拖动控件边缘修改控件大小支持属性编辑器,修改当前选中控件的属性 拖动框选控件,点选控件 控…

AI如何与DevOps集成,提升软件质量效能

随着技术的不断演进,DevOps和AI的融合成为推动软件开发质量提升的重要力量。传统的DevOps已经为软件交付速度和可靠性打下了坚实的基础,而随着AI技术的加入,DevOps流程不仅能提升效率,还能在质量保障、缺陷预测、自动化测试等方面…

Mac配置Flutter开发环境

1、访问 Flutter 官网,下载安装Flutter SDK 2、将 Flutter 添加到 PATH 环境变量 找到用户文件夹中的.zshrc隐藏文件(隐藏文件显示方式:shiftcommand.),打开.zshrc文件,添加Flutter SDK路径,注…

Linux系统使用ollama本地安装部署DeepSeekR1 + open-webui

Linux系统使用ollama本地安装部署DeepSeekR1 open-webui 1. 首先,下载安装ollama #下载安装脚本并执行 curl -fsSL https://ollama.com/install.sh | sh #安装完成后查看ollama版本 ollama --version2. 使用ollama下载deepseek #不同的参数规格对硬件有不同的要…

【Kubernetes】常用命令全解析:从入门到实战(中)

🐇明明跟你说过:个人主页 🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、什么是k8s 2、K8s的核心功能 二、资…

[ComfyUI]腾讯开源黑科技Sonic,插件更新,更加可控啦

一、Sonic更新介绍 大家还记得我前分享过腾讯开源的Sonic这个项目吧,通过照片声音就可以生成非常不错的数字人开口说话的视频。 当时我就挺满意的,不过那时候输出还只能输出正方形的视频,这点就让我留有遗憾。 今天我再去翻作者的项目官网…

设计模式Python版 命令模式(上)

文章目录 前言一、命令模式二、命令模式示例 前言 GOF设计模式分三大类: 创建型模式:关注对象的创建过程,包括单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式和建造者模式。结构型模式:关注类和对象之间的组合&…

微服技术栈之Spring could gateway

0 前言 之前使用到的gateway技术栈 ,光靠记忆可能没有记住那么多的,gateway当今比较主流的网关技术栈了。说到gateway,不得不提及Zuul,而Zuul已经被淘汰了。 1 概述 Could全家桶有个很重要的组件就是网关,在1.X版本…

上课啦 | 2月17日软考高项【5月备考班】

相关文章推荐 福利:【软考-电子书】赠送 | 信息系统项目管理师教程 软考证书以考代评评定的职称是什么?聘任步骤? 添加图片注释,不超过 140 字(可选) 软考 高 项 课程:2月17日开课 | 软考-高…

小米 R3G 路由器刷机教程(Pandavan)

小米 R3G 路由器刷机教程(Pandavan) 一、前言 小米 R3G 路由器以其高性价比和稳定的性能备受用户青睐。然而,原厂固件的功能相对有限,难以满足高级用户的个性化需求。刷机不仅可以解锁路由器的潜能,还能通过第三方固…

【电脑】u盘重装win7

u盘必须8GB以上 1. CPU型号 首先查看CPU的型号看看到底能不能装win7 2. 下载光盘映像文件 网址 看电脑是多少位的机器(32位下载x86 64位下载x64) 一共是这么多个版本按需下载对应的版本 电脑小白推荐无脑下载旗舰版 将链接复制到迅雷进行下载 3. 下载软碟通 网址 下…

wps或office的word接入豆包API(VBA版本)

直接上代码,由于时间匆忙,以后写个详细的教程 #If VBA7 ThenPrivate Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As…

Redis——优惠券秒杀问题(分布式id、一人多单超卖、乐悲锁、CAS、分布式锁、Redisson)

#想cry 好想cry 目录 1 全局唯一id 1.1 自增ID存在的问题 1.2 分布式ID的需求 1.3 分布式ID的实现方式 1.4 自定义分布式ID生成器(示例) 1.5 总结 2 优惠券秒杀接口实现 3 单体系统下一人多单超卖问题及解决方案 3.1 问题背景 3.2 超卖问题的…