四种排序:选择,插入,冒泡,快速排序原理及其对应的时间、空间复杂度解析

2023-11-18

四种排序:选择,插入,冒泡,快速排序原理及其对应的时间空间复杂度

首先,在了解四种排序之前,让我们来了解一下什么是时间复杂度和空间复杂度。

时间复杂度:算法的时间复杂度是一个函数,它定性描述该算法的运行时间。记做T(n)。直白的来说,就是指运行一段代码所需要的时间。

空间复杂度:空间复杂度是对一个算法在运行过程中临时占用存储空间大小的量度。记做S(n)。同样的,它是指运行一段代码所需要占用的内存大小。

四种排序:
一.冒泡排序:

你见过鱼儿吐泡泡吗?每次吐一串泡泡,最大的泡泡都会冒到水上,然后是下一个,当最后一个泡泡也冒到水面上时,那么一串泡泡也吐完了。
冒泡排序,顾名思义,和吐泡泡是一个原理。
当有一串无需数列待排序时,那么冒泡排序就会每次挑选出最大的数,置于这串数的末尾,然后从剩下的数中再挑选出最大的放置在末尾(这里的末尾应当指当前剩余未排列数组的末尾,即上次排好的数之前)。重复,直到最后一个数被排完。
例: 1 3 5 4 2
要求将这段数升序排列

	那么第一次使用冒泡排序的结果:
	(1 3 )(3 5)		(5 4)->(4 5)		(5 2)->(2 5)
	1 3 4 2   5
	第二次:
	1 3 2   4 5
	第三次:
	1 2   3 4 5 
	第四次:
	1   2 3 4 5

值得注意的是,如果剩余几个数未进行比较,但是所有的数都已序,那么剩余的数依旧要比较,直到所有的数都比较完。

附上代码:
冒泡排序
那么,冒泡排序的时间复杂度和空间复杂度各是多少呢?
时间复杂度:

现在我们假设每运行一行代码的时间为t,那么外层循环运行了n-1次,时间为(n-1)t,内层循环运行了n次,时间为nt。
这里,要考虑内层循环的条件判断内容是否执行。
若不出现要交换的次数时
时间最短就为(n-1)+1,时间复杂度为O(n*t),即O(n)。
若每次都需要交换
时间最长就为(n-1)3nt,时间复杂度为O((3n²-3n)*t),即O(n²)。
考虑到平均性,我们将以上时间都除以2,那么得到的,就分别是他们的平均时间复杂度。
但是通常情况下,我们认为冒泡排序的时间复杂度为O(n²)。

空间复杂度:

计算空间复杂度时,我们也要分情况考虑。
最优情况为不需要交换,即没有任何临时变量占用空间。
所以空间复杂度为:0;
最坏的情况是全为逆序数,则内层循环每次都要开辟一个temp临时变量的内存,内层循环共n次,即空间复杂度为:O(n)。
平均空间复杂度:O(1)

二.选择排序
选择排序:即在一组无序数列中,每次选出最大或最小的数,放置在数列的开头,然后继续选出剩下数中最大或最小的数放在已选择数的后面,重复直到最后一个数被选完。

例:1 3 5 2 4
要求将这组数升序排列

那么第一次使用选择排序的结果:
(1 3 )(1 5) (1 2) (1 4)
1 3 5 2 4
第二次:
1 2 3 5 4
第三次:
1 2 3 5 4
第四次:
1 2 3 4 5

同样的,如果某些数段出现了已序现象,那么依旧要继续遍历完直到最后一个数被选完。

附上代码:
选择排序

下面我们来计算选择排序的时间复杂度和空间复杂度。
依旧设每个代码执行的时间为t,下同
时间复杂度:
最优情况:当前数列全部已序
那么交换的次数为0次
则时间为(n-1)*t,即最优时间复杂度为O(n)。

最差情况:当前数列全为逆序
那么交换的次数为n-1次
则时间为n*(n-1)*t,即O(n²)。
取平均时间复杂度,则选择排序时间复杂度为O(n²)。

空间复杂度:
最好的情况:不需要交换,
那么空间复杂度为0

最坏的情况:全为逆序数
那么整个过程就需要temp,i,j,k临时变量,即为4
取平均值可以得到选择排序的空间复杂度为O(1)。

三.插入排序
插入排序:插入排序是一种最简单的排序,即在一组无序数列中,将数列分成有序和无序两部分,一般默认第一个数为已序,将第二个数按照排序准则插入已序数列,再将第三个数插入前两个数组成的已序数列,重复。直到最后一个数被插入。
流程图

例:1 3 5 2 4
要求将这组数升序排列

那么第一次使用插入排序的结果:
1 3 5 2 4
1 3 5 2 4
第二次:
1 3 5 2 4
1 3 5 2 4
第三次:
1 3 5 2 4
1 2 3 5 4
第四次:
1 2 3 5 4
1 2 3 4 5

依然要注意的是在中途出现已序数段要参与比较。

附上代码:
插入排序

插入排序的时间复杂度和空间复杂度:
时间复杂度:
最优情况:全为已序数
那么只要比较n-1次,时间为(n-1)*t,
时间复杂度为O(n);

最坏情况:全为逆序数
那么最多要比较(n-1)*(n-1)/2次
时间复杂度为O(n²)。
平均时间复杂度为O(n²)。

空间复杂度:
最好的情况:全为已序数
无需交换两个数
空间复杂度为0

最坏的情况:全为逆序数
全程需要用到临时变量i j k
所以空间复杂度为O(1);
插入排序的平均空间复杂度为:O(1)。

四.快速排序
快速排序:快速排序是通过一次分割将一个数列分割成以某个数为界限的左右两部分,一边数小于这个分界值,另一边大于这个分界值。分别再将两遍的数,按照同样的方法各选取一个分界值,分成大于和小于分界值的两部分,依次类推,直到分界值左右部分的数不可再分为止。

例:25 20 30 40 35 50 45
要求将这组数升序排列

任意设定一个分界值:30(但是一般以第一个数为分界值)
那么第一次使用快速排序的结果:
{25 20} 30 {40 35 50 45}
第二次:
再给两边选择分界值
20 {25} 30 {35} 40 {50 45}
此时第一次分界值30左边的部分全部已序,那么下面只要排列右边即可
第三次:
20 {25} 30 {35} 40 {45} 50
到此为止,所有数列全部已序。

快速排序

要注意的是,当一部分数列已序时,只需要考虑剩余部分即可。
该排序属于一种递归算法。

附上代码:
快速排序
快速排序的时间复杂度和空间复杂度:
时间复杂度:
最好的情况:
每次划分都将数组平均分:
那么数的个数为(log以2为底2n+1)
第一次要全部遍历,时间为nt
第二次为nt/2
第三次nt/4
……
第n次nt/2的(n减一次方)
则总的T(n)=nT(1)+(log以2为底n)*n
时间复杂度为O(nlog2(n))
即时间复杂度为O(nlogn)。

最坏的情况:
每次选择的分界值只能分出一个子序列,另一个为空。
那么此时需要n-1次递归调用
时间复杂度为O(n²)。

空间复杂度:
最好的情况:每次分割都平均分
所以分割次数为log2(n)
空间复杂度就为O(logn)

最坏的情况:
依旧是每次分割都分割一个子序列和一个空序列。
那么此时需要递归n-1次调用
则空间复杂度为O(n)
快速排序的平均空间复杂度则为O(logn)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

四种排序:选择,插入,冒泡,快速排序原理及其对应的时间、空间复杂度解析 的相关文章

随机推荐

  • 华为OD机试 - 滑动窗口最大和 - 滑动窗口(Java 2023 B卷 100分)

    目录 专栏导读 一 题目描述 二 输入描述 三 输出描述 四 解题思路 五 Java算法源码 六 效果展示 1 输入 2 输出 3 说明 华为OD机试 2023B卷题库疯狂收录中 刷题点这里 专栏导读 本专栏收录于 华为OD机试 JAVA
  • 配置多个TOMCAT

    1 把下载好的tomcat解压到想存放的目录 它不用安装的 在官网下载好 一解压就是了 2 打开电脑的 编辑环境变量 配置CATALINA HOME环境变量如图 我这里装了9和10 先配一个CATALINA HOME9 值是tomcat9的
  • Qt样式表-详解

    一 QT样式表简介 1 1 QT样式表简介 QSS的主要功能是使界面的表现与界面的元素分离 使得设计皮肤与界面控件分离的软件成为可能 QT样式表是允许用户定制widgets组件外观的强大机制 此外 子类化QStyle也可以定制widgets
  • Latex数学公式方程格式总结

    单行公式有自动标号 一般式子之间行距较大 begin equation T tilde nabla lim Delta v rightarrow 0 frac 1 Delta v left oint s T hat n mathrm d s
  • Java接口以及static和final关键字

    Java接口以及static和final关键字 一 static 二 final 三 让final元素可以初始化 不用固定赋值 四 接口 五 抽象方法 六 接口能够创建对象吗 匿名内部类 七 另一实例 开锁 一 static static代
  • OI考试中及平常练习里的一些低级错误总结

    long long相关 1 没开long long long long开少了 具体地 可能是未对题目可能产生的数值预估 可能是只写了int的读优 忽略long long 2 define int long long出锅 1 比如在遍历图的时
  • React中的性能优化

    1 所有的this指向都在constructor中绑定 就避免了多次绑定 this指向问题 只有当this指向我们定义的组件时才能去对state做修改 不去改变this指向 在该方法中this就指向undefined 2 setState是
  • ssm基于微信小程序的社区老人健康管理服务系统的设计与实现毕业设计源码011513

    摘要 随着现在网络的快速发展 网络的应用在各行各业当中它很快融入到了许多分类管理之中 他们利用网络来做这个社区老人健康管理服务系统 随之就产生了 社区老人健康管理服务系统 这样就让社区老人健康管理服务系统更加方便简单 对于本社区老人健康管理
  • Puzzles【Codeforces 697 D】【树形DP + 期望DP】

    Codeforces Round 362 Div 2 D 我们从1号结点开始 给每个结点标序 问的是每个结点的序号的期望是多少 输出这N个结点的期望 那么1号点的期望一定就是1了 对于其他的点呢 可以举例这样的一幅图 首先我们可以确定1 因
  • 基于UDP编程

    基于UDP编程 1 UDP是数据报协议 无连接的 不可靠 追求传输效率的一种通信协议数据的发送和接收是同步的 在进行通信之前 不需要建立连接 其传输效率比TCP高 对其服务器而言 并没有三次握手的过程 因此和TCP相比 少了被动监听 lis
  • Springboot实现发送邮件功能

    相信使用过Spring的众多开发者都知道Spring提供了非常好用的JavaMailSender接口实现邮件发送 在Spring Boot的Starter模块中也为此提供了自动化配置 下面通过实例来讲解如何在Spring Boot中使用Ja
  • 发布自己的Python包(Pypi)

    发布自己的Python包 Pypi 我们经常使用 Pypi 来安装包 但是有时候我们也想要发布自己的 Pypi 包 有可能我们写了一个特别牛的包 也有可能我们只是想使用自己常用的一些轮子 可能这是我们日常编码中很常用的一些轮子 我们在不同工
  • AttributeError: 'list' object has no attribute 'shape'

    深思熟虑 运筹帷幄 疑惑 解惑 shape 是数组的属性 不是集合的属性 可把集合变成数组 如np array list A
  • 架构之道:分离业务逻辑和技术细节

    点击上方 朱小厮的博客 选择 设为星标 当当满200减40优惠码 J2KNAE 来源 阿里巴巴云原生 1 什么是架构 关于架构这个概念很难给出一个明确的定义 也没有一个标准的定义 硬是要给一个概述 我认为架构就是对系统中的实体以及实体之间的
  • [深度学习] - 网络模型训练过程的 loss 变化分析 (loss / val_loss / test_loss)

    目录 一 train set 和 test set 基础知识 二 分析 loss 和 val loss test loss 变化情况 一 train set 和 test set 基础知识 train set 训练集是用来训练网络模型的数据
  • 大数据主要应用于哪些行业,应用价值是什么?

    大数据无处不在 大数据应用于各个行业 包括金融 汽车 餐饮 电信 能源 体能和娱乐等在内的社会各行各业都已经融入了大数据的印迹 下面详细介绍一下大数据在各行各业的具体应用 制造业 利用工业大数据提升制造业水平 包括产品故障诊断与预测 分析工
  • - UnitBox An Advanced Object Detection Network,arxiv 16.08

    UnitBox An Advanced Object Detection Network arxiv 16 08 download 该论文提出了一种新的loss function IoU loss 这点比较有意思 也容易复现 论文分析了fa
  • Python之子类调用父类的两种方式

    第一种方式 直接在子类中调用父类名 调用方式如下 Vehicle init self name speed load power 调用父类的实例 Vehicle run self 调用父类的方法 下面给出具体样例 直接调用父类名 class
  • Tesseract-OCR4.0在Visual Studio2015中的编译及运行

    最近项目需要使用到OCR引擎 通过百度了解到Tesseract在这方面做的挺好的 于是便开始学习tesseract tesseract的github地址 https github com tesseract ocr tesseract 现在
  • 四种排序:选择,插入,冒泡,快速排序原理及其对应的时间、空间复杂度解析

    四种排序 选择 插入 冒泡 快速排序原理及其对应的时间空间复杂度 首先 在了解四种排序之前 让我们来了解一下什么是时间复杂度和空间复杂度 时间复杂度 算法的时间复杂度是一个函数 它定性描述该算法的运行时间 记做T n 直白的来说 就是指运行