c++ 二维数组 排序_漫画:“排序算法” 大总结

f740a0a14d59382a2b45f7d84dfefcbb.png

3d628ae90ec949b5f54f0327ab60f881.png

0cde489af4bec9d2a0791e4973b99ef6.png

435577eac01aa66350f6569d0bddf5cb.png

7e635fc628ea44e3dd967dd689fb7605.png

7deea3069509f974c9e374e72420ce53.png

​冒泡排序:

漫画:什么是冒泡排序?​mp.weixin.qq.com
e3594463aa889a6289ec747114d8da3f.png

选择排序:

漫画:什么是选择排序?​mp.weixin.qq.com
9ec59a4c085d39b3b45468d93e50aa59.png

插入排序:

漫画:什么是插入排序?​mp.weixin.qq.com
b7be7da69032cde368ed0b03c2915bfc.png

此外还有冒泡排序的变种,鸡尾酒排序:

漫画:什么是鸡尾酒排序?(修订版)​mp.weixin.qq.com
c3d6068001c505cb0fc013db8011593b.png

第三梯队的排序算法有什么共同点呢?它们的平均时间复杂度都是O(n^2)

333717e28fa67f8a28e18f6b94cc3cfd.png

8b0761fcccac914d3b25d4d24836695b.png

冒泡排序、选择排序、插入排序之间,究竟有什么样的差别呢?

首先从性能来分析,冒泡排序插入排序的元素比较交换次数取决于原始数组的有序程度

如果原始数组本来已经接近有序,只需要较少的比较交换次数即可完成排序。比如下面这个数组,只有7和8是逆序的:

6e56c1a4f1bd2be23402ba1f83afb258.png

如果原始数组大部分元素无序,则需要较多的比较交换次数。比如下面这个数组,绝大部分元素都是无序的:

b67943c0e7c9708ef63dcec06b9367ed.png

在此基础上,插入排序的性能略高于冒泡排序。为什么这么说呢?因为冒泡排序每两个元素之间的交换是彼此独立的,比如A和B交换,B和C交换,C和D交换:

c44c878922b0597e7560876be468167d.png

而插入排序的元素交换是连续的,比如把B赋值给A,把C赋值给B,把D赋值给C,最后把A赋值给D:

007951fabaf417a051fa45613ca5610b.png

显然,归并排序的连续交换方式省去了许多无谓的交换操作。

再来说说选择排序,选择排序和前面两者不太一样,它的元素比较交换次数是固定的,和原始数组的有序程度无关

因此,当原始数组接近有序时,插入排序性能最优;当原始数组大部分元素无序时,选择排序性能最优

下面再说说排序的稳定性:

冒泡排序和插入排序是稳定排序,值相同的元素在排序后仍然保持原本的先后顺序。

选择排序是不稳定排序,值相同的元素在排序后不一定保持原本的先后顺序。

2818c0993779b3950677cc2df439fab4.png

希尔排序:

漫画:什么是希尔排序?​mp.weixin.qq.com
f4e8c8ac99646e7b43a2ce4ab6b0aaa8.png

快速排序:

漫画:什么是快速排序?(完整版)​mp.weixin.qq.com
07847f276baa0b5c8762245510cd5b25.png

归并排序:

漫画:什么是归并排序?​mp.weixin.qq.com
9bddf5093b6bfc51400fddb34ae4f9f7.png

堆排序:

漫画:什么是堆排序?​mp.weixin.qq.com
1575f6c044e2339365edd262bce1d155.png

第二梯队的排序算法有什么共同点呢?它们的性能比第三梯队要高一个量级,其中希尔排序的平均时间复杂度最快可以达到O(n^1.3),快速排序、归并排序、堆排序的平均时间复杂度是O(nlogn)

65be22ff9a5736eed7240053c6786ad7.png

1f08c618278c6cb4f4462806b4b3df78.png

快速排序、归并排序、堆排序之间,究竟有什么样的差别呢?

还是先从性能来分析,虽然快速排序的平均时间复杂度是O(nlogn),但是在极端情况下,最坏时间复杂度是O(n^2)

而归并排序和堆排序的时间复杂度稳定在O(nlogn)。

至于平均时间复杂度,虽然三者同样都是O(nlogn),但是堆排序比前两者的性能略低一些。为什么呢?主要是由于二叉堆的父子节点在内存中并不连续

在访问内存数据时,对于顺序存储的数据,读写效率往往是最高的。根据CPU的空间局部性原理,CPU在每次访问数据的时候,会把内存中相邻的数据也一并存入缓存。这样一来,CPU以后再访问邻近的数据就不需要重新访问内存,而是访问CPU缓存,从而大大提升了程序执行的效率。

下图是有些夸张的示意:

51f47f1c5bbce04f1c585b4475cb5ef9.png

在堆排序的过程中,常常需要父子节点之间进行比较和交换,而父子节点在数组中的位置并不是相邻,而是相差两倍左右:

6c015aea664d782d0fb969c4c406fc51.png

反观快速排序和归并排序,无论是快速排序中把元素移动到pivot两侧,还是进行归并排序中的merge操作,都是按照数组元素的自然顺序依次进行比较和交换操作。

因此,堆排序的平均性能比快速排序和归并排序略低。

至于排序的稳定性,归并排序是稳定排序,快速排序和堆排序是不稳定排序

此外,快速排序和堆排序是原地排序,不需要开辟额外空间。而归并排序是非原地排序,在merge操作的时候需要借助额外的辅助数组来完成。

9935a808ed43762d2edea46b9f0dfe89.png

计数排序:

漫画:什么是计数排序?​mp.weixin.qq.com
6d8e1dd9821e618df8dea911e18510ae.png

桶排序:

漫画:什么是桶排序?​mp.weixin.qq.com
6d0647ba99993b77e837968cbb64dd51.png

基数排序:

漫画:什么是基数排序?​mp.weixin.qq.com
d110e9ca7fdf7d30e15915928f4680f1.png

第一梯队的排序算法有什么共同点呢?它们的性能比第二梯队又要高出一个量级,都属于线性时间复杂度的排序算法。

虽然计数排序、桶排序、基数排序同为线性排序算法,但它们的时间复杂度有着很大不同:

计数排序的时间复杂度是O(n+m),其中m是原始数组的整数范围。

桶排序的时间复杂度是O(n),这是在分桶数量是n的前提下。

基数排序的时间复杂度是O(k(n+m)),其中k是元素的最大位数,m是每一位的取值范围。

至于排序的稳定性,这三种排序算法都属于稳定排序

6330b320b4e4d46c5ebf23701eb91d1d.png

有哪些又出门又奇葩的排序算法呢?

睡眠排序

猴子排序

珠排序

漫画:三种 “奇葩” 的排序算法​mp.weixin.qq.com
b2a4ae040ff480fe16e31d24a248544d.png

这三种排序算法体现出了发明者天马行空的想象力,大家可以拿来娱乐一下,但是在现实工作中如有排序需求,可千万不要调用它们啊!

67b0de3ebaa63a33e6cb32793139c71c.png

b84fd54b6aa3ce1bb2a9979a4c0af22d.png

8b24bb97fc9e894ecdc0c9dc37308796.png

b4a8faba4c85c1c055e7193d2175d151.png

b1ffe7e77911fe07a47e23003f04042d.png

b79ae3968727d58f8806b9cd8102dbe6.png

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

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

相关文章

ieee39节点系统介绍_Java秒杀系统实战系列-基于ZooKeeper的分布式锁优化秒杀逻辑...

本文是“Java秒杀系统实战系列文章”的第十六篇,本文我们将继续秒杀系统的优化之路,采用统一协调调度中心中间件ZooKeeper控制秒杀系统中高并发多线程对于共享资源~代码块的并发访问所出现的并发安全问题,即用ZooKeeper实现一种分布式锁&…

centos配置c语言环境变量,CentOS7设置环境变量

一、环境变量的概念1、环境变量的含义程序(操作系统命令和应用程序)的执行都需要运行环境,这个环境是由多个环境变量组成的。2、环境变量的分类1)按生效的范围分类。系统环境变量:公共的,对全部的用户都生效。用户环境变量:用户私…

python 3.7.732位安装步骤_Python3.7安装pyaudio教程解析

本人笔记本电脑安装的是 python3.7, 64位操作系统,基于x64的处理器 因为 pyaudio 暂时不支持 python3.7 和 3.8,所以若需要安装 pyaudio 需要下载 whl 文件后再离线进行安装。 首先:下载安装 pyaudio 的 whl 文件 然后按下 ctrlf 输入关键字&…

python open写入_Python3 open() 函数详解 读取文件写入文件追加文件二进制文件

Python3 open() 函数详解 读取文件写入文件追加文件二进制文件 open()函数的主要作用是打开文件并返回相应文件对象,使用文件对象可以对当前文件进行读取、写入、追加等操作,默认情况下"r"模式,文件不存在的话会发生OSError错误的。…

一部分 数据 迁移_从虚机到容器,知名架构师告诉你如何平滑进行业务迁移

【小宅按】近期,短视频产品“秒拍”完成了一个“大动作”——将原来部署在虚拟机上的主体业务迁移到华为云,同时将公司的技术体系承载在下一代虚拟技术容器(Docker)上。而这一系列动作是在业务不下线,用户无感知的前提…

cuda 实现sift gpu_为Keras提供GPU加速

在刚入坑机器学习时,书上所使用的算法(回归、决策树等)及实例较为简单,一般CPU(中央处理器)的计算能力均能胜任,从而快速实现。但若使用keras(一种基于深度学习框架的高级应用接口&a…

此 sqltransaction 已完成;它再也无法使用_win10笔记本自带office报错无法激活的解决方法...

激活win10笔记本电脑自带office出错怎么办?不少笔记本电脑在出厂的时候就自带windows 10操作系统并且将系统部署完成后就有许多软件集成当中,一般按正常步骤进行激活即可正常使用,不过有用户遇到一个问题,在激活自带office时报错了&#xff…

bat 连续读取两行_Redis底层数据结构解析(BAT大厂必问)

Redis是一个key-value存储系统,现在在各种系统中的使用越来越多,大部分情况下是因为其高性能的特性,被当做缓存使用。Redis由于其丰富的数据结构也可以被应用到其他场景。Redis是一个K-V的非关系型数据库(NoSQL)&#…

smart原则_为什么现在少有人用德鲁克的SMART原则做目标管理了?

互联网平台充斥了各类成功学文章,但大多数鸡汤文只谈坚持,不谈策略。王健林定下一个亿的小目标被网友编成了各种段子,却极少有人去探究他实现目标的过程,用的什么方法。从企业规模来看,我们没有理由说王健林定下的目标…

团队组成五个基本要素_【记录】综合分部宁波分队团队拓展活动

初冬,像一位美丽的、高贵的、矜持的公主,舞动着她那神奇的面纱,送来阵阵凛冽的寒风。今年宁波分队队伍逐渐壮大,从年初的70多人到目前120人,队伍中也迎来了许多00后的小伙伴们,为加强企业文化建设&#xff…

linux delete内存不下降_linux内存分配管理

linux内存分配管理一、前言作为从事与C/C程序开发人员,我们一直需要很好的管理内存,申请和释放;可能很多只知道使用malloc、new去申请,使用free、delete去释放,但是,去根究其内部的原理,可能就不…

android studio 2.3 instant run,android studio 2.3 instant run not working

可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):问题:I have updated android studio from 2.2 to 2.3,then I found Instant run not working.Error while executing: am startservice com.example.codingmaster.te…

和catch的区别_BIO、NIO、AIO 的区别是什么?

BIO、NIO、AIO 的区别是什么?同/异步、阻/非阻塞的区别是什么?文件读写最优雅的实现方式是什么?NIO 如何实现多路复用功能?带着以上这几个问题,跟着芒果一起进入IO的世界吧。在开始之前,我们先来思考一个问…

302状态码_HTTP协议详解(基础概念 方法 状态码 首部 连接 Cookie 新特性 安全)

一 、基础概念URIURI 包含 URL 和 URN。请求和响应报文1. 请求报文2. 响应报文二、HTTP 方法客户端发送的 请求报文 第一行为请求行,包含了方法字段。GET获取资源当前网络请求中,绝大部分使用的是 GET 方法。HEAD获取报文首部和 GET 方法类似&#xff0c…

flask get 参数_用它 5 分钟以后,我放弃用了四年的 Flask

“ 阅读本文大概需要 3 分钟。 ”有一个非常简单的需求:编写一个 HTTP 接口,使用 POST 方式发送一个 JSON 字符串,接口里面读取发送上来的参数,对其中某个参数进行处理,并返回。如果我们使用 Flask 来开发这个接口&…

android sse 人脸识别,基于Android Camera2之openCamera 流程

简介frameworks\base\core\java\android\hardware\camera2Camera2在Android 5.0上首次出现,主要重新定义了一套Camera 的使用接口API,设计思想出现了变化,具体的可自行搜索,此处主要介绍下Camera2的常见类以及使用流程。CameraCap…

vscode编辑python_VSCode+Python开发环境

准备开始转向用VSCode做开发,所以把一些常用的开发环境转移到VSCode上。 这次搭建的是Python3的开发环境。 其他相关博文: 一、测试环境 Windows 10 VSCode v1.11.1 Python v3.6.1 二、安装Visual Studio Code 三、安装Python这一步,记得…

html5 css3浏览器,五大主流浏览器CSS3和HTML5兼容性大比拼

五大主流浏览器CSS3和HTML5兼容性大比拼出处:快科技 2011-05-26 16:15:42 编辑:萧萧[爆料] 收藏文章各大主流浏览器对CSS3和HTML5的支持越来越完善,曾经让多少前端开发人员心碎的IE系也开始拥抱标准。就在前几天,W3C的HTML5社…

一个控制器怎么转发到另外一个控制器_楼宇自动化系统(BAS),DDC,一个最核心的控制器...

楼宇自动化系统(BAS),一个熟悉又陌生的系统楼宇自控系统(BAS系统)设有一个中央监控中心,系统配置一个或多个网络控制器,由多条总线或计算机网络将各种功能的控制器与中央工作站相连,完成对空调、给排水、通风、电梯等子系统的监控…

html封装windows,windows 系统封装,打造一份属于自己的系统!

在电脑的使用过程中,由于我们每个人的使用习惯和使用方式不同,所以我们都会对Windows系统进行自己的设置,尤其是一些搞数码软件的,如果不小心系统坏了,重装系统后,还得一一去进行重新设置,非常麻…