经典排序方法思路简介

news2024/10/7 16:19:51

参考:https://zhuanlan.zhihu.com/p/166199924,https://www.runoob.com/w3cnote/ten-sorting-algorithm.html
**稳定性:**是表示相同值的数据在排序好的结果中的位置前后关系依然不会变,例如[3,1,3],排序后的最后一个3位置不变,只是第一个3和第二个1换了位置
**时间复杂度:**对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律
排序方式:In-place,和Out-place表示是否需要额外内存空间
在这里插入图片描述

各种排序方法

冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序

各种排序动图演示

参考:

各种排序个人简介

冒泡排序(bubble sort)

相邻的数据比较得到较大值,然后把较大值放在右侧,并以这个较大值为基准,再向右比较,最终的右边数据是整个数据最大。因此,相等的数据不会改变位置相对关系,是稳定排序。

选择排序(selection sort)

将空间分为两部分:无序空间;无序空间。将无序空间中的最小(大)比较选出来,然后将这个数据放入有序的空间。比较过程中当遇到满足条件的数据,直接将索引交换,而不是像冒泡排序每比较一次就要换位置或修改最大标记的指向。例如,5 8 5 2 9,比较过程中第一个5的索引和2的索引直接交换,导致下次比较时,原来右边的位置却先被放入有序空间中,因此这是不稳定的排序

插入排序(insertion sort)

假设第一个数字有序,将后边的数字一个一个的插入前面有序的地方。比较的方式是将无序的一个数和前面有序的数据从右向左比较,当比较的值比无序的值大时才交换位置。因此同样大小的数据不会交换位置,所以也是稳定排序。

希尔排序(Shell Sort)

将数据每隔一个增量k做为一组进行插入排序,例如[1,2,3,4,5,6,7,8],把增量为3作为一组进行排序,分成[1,4,7]和[2,5,8]和[3,6]三个个组,对每个组进行进行一趟插入排序(注意实在原有的位置上比较两组数据和修改索引位置)。第二次减少增量值,重复操作,知道增量为1会对所有的数据进行插入排序,但前面的操作几乎把数据拍好,很少需要调整。但和插入不同相同,这是不稳定的排序,因为分组时可能出现某一个组较大,把和另一组相同的数据放入更前面

归并排序(merge sort)

将数据全部分散开,对于二路归并,将每两个进行比较生成一个只包含两个数据的有序数组;然后将只包含两个有序数据的数据归并成4个有序的数组;依次处理到最后把整个数据都归并成有序的。这是一个稳定的排序。

快速排序(quick sort)

首先,规定一个基准,然后把数据分为全部大于该基准和全部小于该基准的两部分,利用同样的思想对这两个子部分进行排列有序,合并后就有序

堆排序(Heap Sort)

在这里插入图片描述

堆:一种数据结构,最大堆是每一个节点的键值不小于其孩子节点。例如[9, 6, 8, 3, 1, 4, 2]

在这里插入图片描述

从上面的堆来说,根节点一定是最大的值。把它和最右下的节点交换,然后把剩下的堆调整到一个新的堆。接着取出调整后的根节点和最后一个子节点交换位置,依次得到一个有序的堆。堆调整过程,先找到要调整比较的节点,取的是总节点数的1/2取整的节点索引。然后和左右子节点最大的比较,若父节点小,则交换位置,若两个子节点的大小相同,这交换的是左节点的索引。但对于已经调整好的堆只是交换了开头和结尾后的数据,直接将根节点作为比较节点就行。因为,除了被交换的两个节点,其他节点已经满足最大堆的规律。这种明显是不稳定的排序
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

计数排序(bubble sort)

这种方式不是基于比较的,是根据记录每一个数据的数量,然后将记录的数量输出。
先找到所有要排列数据的最大最小值。统计出每个数据的出现次数。然后将统计出的次数,根据数据的大小顺序,进行反向输出,每输出一个就把记录的次数减去1。对于不密集的数据建立字典会有很大的浪费。这种排序可以说和原来相同大小数据的位置没什么关系了,根本说不上稳定还是不稳定吧,但看资料中写的是稳定

桶排序(Bucket Sort)

设置多个”桶“可以存放某段的数据,例如,设置0桶可存放0到9的数据,1桶存放10到19的数据等。将这些分开的非空的数据桶进行排序,最后只要把这些桶拼接在一起就行。这种排序是稳定的

基数排序(Radix Sort)

可以理解为从低位开始只看某一位大小,将数据放入0到9的桶内。第一次,根据个位上数字的大小,可以将数据分成10组,然后将每一个数组的数据根据先放入先拿出的规则重新列出来;然后看10位上的数字大小,放入0到9的桶内。假设最大就是两位数字,这时同一个桶里的小数一定被先放进去,因为十位相同但个位大的数据在后面。使用参考连接中的gif图更清晰,这是稳定的排序
请添加图片描述

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

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

相关文章

java项目-第141期ssm美好生活日志网-ssm毕业设计_计算机毕业设计

java项目-第141期ssm美好生活日志网-ssm毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm美好生活日志网》 该项目分为2个角色,管理员和用户。 用户可以浏览前台,包含功能有: 首页、日记信息、美食信息、景点信息、新闻推荐 、日记展示、论坛信…

【现代密码学原理】——数字签名(学习笔记)

📖 前言:数字签名(又称公钥数字签名)是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。它是一种类似写在纸上的普通的物理签名,但是…

解读JVM级别本地缓存Caffeine青出于蓝的要诀3

Caffeine的异步淘汰清理机制 在惰性删除实现机制这边,Caffeine做了一些改进优化以提升在并发场景下的性能表现。我们可以和Guava Cache的基于容量大小的淘汰处理做个对比。 当限制了Guava Cache最大容量之后,有新的记录写入超过了总大小,会…

HTML---表单详解

目录 一、表单介绍 二、表单元素 1:input输入表单元素 (1) text和password (2)radio和checkbox (3)button 2:label标签 3:select下拉表单元素 4:textar…

喜报 | 强强联手,这件大事终于有着落了

近日,擎创科技与国产数据库领先品牌——达梦数据库达成战略合作伙伴关系,双方将在品牌、产品、技术、渠道等方面进行全方位合作,共同完成产品整合、资源共享、联合方案等事宜;共同赋能于金融、能源、交通等行业的数字化转型&#…

2019年1+X 证书 Web 前端开发中级理论考试题目原题+答案——第一套

📚文章目录 🎯关于1X标准 🎯关于中级考点 ⏩💻答案速查 一、单选题(每小题2分,共30小题,共60分) 二、多选题(每小题2分,共15小题,共30分&…

Java入门-Java语言概述

1、Java语言基本概述 1.1、什么是计算机编程语言 人与人之间是如何沟通的呢?从小父母就教会我们说话,在长期的熏陶和自我学习中,我们就学会了普通话,学会了表达自己的需求,父母收到我们的信号或者听到我们的要求也会尽…

C# 自定义控件

一 自定义控件 1 自定义控件的三种方式: 1)复合控件:将标准控件组合起来 class YourControl:UserControl{}2) 扩展控件:继承于标准控件 class YourControl:Button{}3) 自定义控件:完全地自定义一个控件 class You…

CSSStyleSheet 对象(css 样式表)- 你不知道的有趣功能

1.概念 CSSStyleSheet 对象 代表着,css文件被浏览器解析后生成的css样式表。 CSS 样式表由 CSS 规则组成,可以通过 CSSRule 对象操作每条规则。CSSStyleSheet 对象允许您查询、插入和删除样式表规则。 例如:好玩儿的尝试(改变页…

基于经验论述:实现k-NN算法

以兰普威尔小镇为例,那里的人们为他们的两支球队——兰普威尔红队和兰普威尔蓝队——而疯狂。红队已经存在很长时间了,人们很喜欢这支队伍。 但是后来,一些外地来的富翁买下了红队的最佳射手,成立了一支新的球队——蓝队。令多数红队球迷不满的是,这位最佳射手将继续带领蓝…

数据结构与算法_BST树_BST树的定义及删除操作

先写BST树的定义及特点,然后记录BST数的删除操作。 1 BST定义及特点 BST数是一棵特殊的二叉树,如何能得到一颗二叉搜索树呢?下面一个有序序列,经过二分搜索,得到的就是一颗BST树。根节点就是当前一轮要搜索的中间节点…

Cell子刊:器官再生,这种病可以让受损的肝脏再生

麻风病是由麻风杆菌引起的一种慢性传染病,主要病变在皮肤和周围神经。它是世界上最古老和最顽固的疾病之一,但引起它的细菌也可能具有令人惊讶的生长和再生重要器官的能力。器官再生是治疗疾病、损伤或衰老功能障碍的理想策略,尽管体外模型、…

linux-adnroid 键值枚举与注释

一、概述 没有找到直接的linux 键值枚举的注释。在android 官网linux-android健码网页里找到了这个映射关系。因为android列的比较多。去掉冗余摘取主要对比和注释进表格。 二、术语摘抄解释 HID 用法、Linux 键码和 Android 键码 系统根据抽象层使用几个不同的标识符来引用…

【服务器数据恢复】5节点Lustre分布式文件系统RAID5数据恢复案例

服务器数据恢复环境: 5台服务器节点,每台服务器节点配置一组RAID5,每组6块硬盘,其中1块设置为热备盘。 系统环境为Lustre分布式文件系统,5台服务器共同存储全部的数据文件。 服务器故障&检测: 机房漏水…

你被裁了需要知道的一些细节

前言 就在上周,得知自己要被裁了,理由是公司在疫情下的经济性裁员,在这里总结一下关于裁员过程中需要注意的一些细节。 关于工作交接 要在收到书面通知之后,再进行工作交接,否则可能面临的风险是公司卸磨杀驴。 关…

C++初阶 List的模拟实现

作者:小萌新 专栏:C初阶 作者介绍:大二学生 希望能和大家一起进步 本篇博客简介:模拟STL中List的实现 List的模拟实现本篇博客目标节点类的实现构造函数迭代器类的实现迭代器类模拟实现的意义迭代器类的三个参数说明构造函数运算…

zabbix自定义模板,邮件报警,代理服务器,自动发现与自动添加及snmp

内容预知 1.自定义监控内容 监控案例1:登录人数检测 具体步骤 步骤一:在客户端创建自定义 key 步骤二:在 Web 页面创建自定义监控项模板 (1)创建模板 (2)创建应用集(用于管理…

《数据结构》顺序表ArrayList

《数据结构》顺序表ArrayList 文章目录《数据结构》顺序表ArrayList什么是顺序表:模拟实现顺序表(以int类型为例)详解ArrayList:ArrayList实现的接口:ArrayList的构造方法:对源码的解析:ArrayList的方法ArrayList的扩容机制ArrayList的缺陷什么是顺序表: 顺序表是用一段物理地…

【Hack The Box】windows练习-- acute

HTB 学习笔记 【Hack The Box】windows练习-- acute 🔥系列专栏:Hack The Box 🎉欢迎关注🔎点赞👍收藏⭐️留言📝 📆首发时间:🌴2022年11月17日🌴 &#x1f…

并发入门组件AQS源码解析(未完善)

必要掌握技术 阻塞,唤醒与中断 阻塞与唤醒 LockSupport的park使用的是Parker->park() synchronized的wait,synchronized的monitorenter使用的是ParkEvent->park(), 而LockSupport的unpark,Parker->unpark() synchroni…