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,一经查实,立即删除!

相关文章

c语言线程经常段错误的是,由pthread_create引起的段异常

由pthread_create引起的段错误一般线程的结束是由进程内的其他线程来结束的,调用pthread_cancel.但是需要考虑到被结束线程的性质,一方面,线程是可被结束,也可无法结束,即不响应该信号;另一方面&#xff0c…

python request url编码_Python 爬虫 (requests) 发送中文编码的 HTTP POST 请求

向往常一样发送POST请求出现错误网站信息表单页面结果网页使用 gb2312 编码使用 requests 发送 post 请求In [2]: import requestsIn [3]: from bs4 import BeautifulSoup as BSIn [4]: url http://example.com/ip/search.aspIn [5]: data {...: loudong: 女生九栋,...: fang…

python坐标定位_如何利用Python识别并定位图片中某一个色块的坐标?

依赖python包|opencv、numpy、aircv 第一步:查找图片在原始图片上的坐标点 import aircv as ac def matchImg(imgsrc,imgobj,confidencevalue0.5):#imgsrc原始图像,imgobj待查找的图片 imsrc ac.imread(imgsrc) imobj ac.imread(imgobj) match_result …

centos7打开图形界面命令_centos7标准版(DVD)命令界面和图形界面相互切换

1、root登陆终端2、输入命令 vi /etc/inittab ,查看两种界面的启动模式:vi /etc/inittab3、退出vi模式,,输入命令systemctl get-default 查看当前系统启动模式;我的是命令界面模式为:multi-user.target;4、…

为什么编程语言要从c语言学起,在那么多编程语言中,为什么推荐初学者学 C 语言?...

如果你学过了计蒜客的《编程初学入门常识》的课,你就会知道,一个汇编写的操作系统,是没有办法在不同的计算机上普适使用的。所以呢,Ken 和 Dennis 为了让更多人在非 PDP-7 小型机的计算机上也玩上《星际旅行》的游戏,决…

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

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

curl shell 失败_linux – curl命令不在bash中通过shell脚本执行

我正在学习shell脚本!同样我尝试在ubuntu终端上使用curl下载facebook页面.t.sh内容vivi-Dell-7537(Desktop) $cat t.shcurlCmd"curl \"https://www.facebook.com/vivekkumar27june88\""echo $curlCmd($curlCmd) > ~/Desktop/fb.html运行脚本…

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 输入关键字&…

java语言程序设计是c语言吗,浅析C语言和Java语言的异同.pdf

新一代信息技 m0 l0、… … … …浅析C语言和Java语言的异同张亚荣(通辽职业学院信息技术系,内蒙古通辽 028000)【摘 要l文章根据本人多年对c语言和Java语言教学过程中遇到的一些实际问题,诸如Java语言是不是c语言发展和衍生的产物等。基于此&#xff0c…

python搜论文_python论文

浅谈我眼中的 python 吴凡 摘要: 作为一门非常有潜力的高级语言, python 正在编程上发挥着越来越大的作用。这学期,通 过对 python 基础知识的学习,对 python 有了一定的认识。同时和已经学习的高级语言 C 和 C 有了一定的对比&am…

图书管理系统c语言报告调试分析,图书管理系统C语言程序设计实验分析报告.doc...

图书管理系统C语言程序设计实验分析报告C语言程序设计实验报告系别专业班级姓名学号时间实验题目 图书信息管理系统一、实验目的(1)熟练掌握C语言的相关操作。(2)综合应用C语言的知识,独立完成一个完整的系统,提高编程能力,体会软件程序的开发…

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

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

python deepcopy报错_python 字典对象赋值之deepcopy遭遇的问题及解决过程(lxml惹的祸)...

今天在写一段代码的时候,需要对字典进行传值操作。一般情况下字典a 字典b,意味着是传引用,b发送改变的情况下a也会发生改变。我的字典如下a{testcase: {attributes: {classname: testdemo, circles: 2, casecode: case02, description: u/u6…

c语言printf函数很长时间,C语言学习之printf()函数特别注意事项

https://m.toutiao.com/is/eLAopLB/做为C语言程序的输出函数printf()在使用时除了其正常的使用之外,还有特别要注意的地方:1、在函数里面,基本上只有三种字符,一种为格式字符,最常见的有%d(十进制整数),%f(浮点数形式)…

python的三种结构_Python控制结构,python

比较运算符 布尔类型 布尔值有两个:True和False 例1: a True a 例2: 2 3 提示: 1.不要把赋值(一个等号)与比较(两个等号)混淆。 2.Python是区分大小写的,所以True与tru…

机器人 知乎碧桂园_万亿负债之下,碧桂园启动人事调整

原标题:万亿负债之下,碧桂园启动人事调整疫情之下,各行各业如履薄冰。作为资金密集型和人员密集型行业,房地产业头顶本就悬着一把「房主不炒」的达摩克里斯之剑,现在又面临销售阻遏,受到的冲击尤其大&#…

python转换函数使用_Python Socket模块中的IP转换函数

Python Socket模块中包含一些有用IP转换函数,说明如下: socket.ntohl(x) // 类似于C语言的ntohl(x) 把32位正整数从网络序转换成主机字节序。 socket.ntohs(x) // 类似于C语言的ntohs(x) 把16位正整数从网络序转换成主机字节序。 socket.htonl(x) // 类似…

嵌入式 c语言 面试题,嵌入式面试题-持续更新

1.用预处理指令#define声明一个常数&#xff0c;用以表示1年中有多少秒(忽略闰年问题)。#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL //最后的UL代表无符号整数。2.写一个“标准”宏MIN&#xff0c;这个宏输入两个参数并返回较小的一个。#define MIN(x, y) ((x) < …

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

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