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

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

时间复杂度:算法的时间复杂度是一个函数,它定性描述该算法的运行时间。记做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)。

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

  1. golang实现四种排序(快速,冒泡,插入,选择)

    本文系转载 原文地址: http://www.limerence2017.com/2019/06/29/golang07/ 前面已经介绍golang基本的语法和容器了,这一篇文章用golang实现四种 ...

  2. 选择排序,插入,快排,冒泡排序的时间空间复杂度详解

    时间复杂度 在算法的分析中,语句的执行次数T(n)是一个关于n(问题规模)的一个函数.分析n的变化引起T(n)的改变,进而得到T(n)的数量级,也就是时间频率.如果存在某一个辅助函数f(n),当n趋于 ...

  3. Java面试宝典系列之基础面试题-常见的几种排序算法-插入、选择、冒泡、快排、堆排等

    常见的几种排序算法-插入.选择.冒泡.快排.堆排: https://blog.csdn.net/zhangerqing/article/details/8831542

  4. 数组的四种排序方法介绍

    最近在学习和练习一些算法方面的知识,发现在java中运用数组进行排序一般就四种方法:快速排序法.冒泡法.选择排序法.插入排序法.我们只要掌握这四种排序方法,基本上就能解决所有的排序问题.所以我接下来就 ...

  5. php主要算法设计,四种排序算法设计(PHP)

    标签 详细分析 /** * 四种排序算法设计(PHP) * * 1) 插入排序(Insertion Sort)的基本思想是: 每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当 ...

  6. 比较排序算法的时间复杂度 c语言,c语言四种排序算法时间复杂度比较(10页)-原创力文档...

    1.方案设计: 我这次实验通过随机生成30000个随机数,把随机数存到数组中,用这同一组随机数据分别进行四种排序,直接插入排序.直接选择排序.冒泡排序和快速排序.还通过了调用txt文件把运算所需时间导 ...

  7. 数据结构:四种排序的比较

    对大数据进行排序时,冒泡排序.选择排序.奇偶排序.插入排序的效率不相同 各种排序的代码: 冒泡排序: View Code 1 public void bubbleSort() 2 { 3 int ou ...

  8. Hive中的四种排序方式(order by,sort by,distribute by,cluster by)使用与区别详解

    在平时的Hive数仓开发工作中经常会用到排序,而Hive中支持的排序方式有四种,这里结合具体的案例详细介绍一下他们的使用与区别: order by sort by distribute by clus ...

  9. php四种基础算法:冒泡,选择,插入和快速排序法

    许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣.作为一个初级phper,虽然很少接触到算法方面的东西 .但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要 ...

最新文章

  1. 图像处理之让手心长出眼睛,其实嘴也可以
  2. axios02-其他使用方式(推荐)
  3. SAP UI5 oFileUpload.getUploadEnabled()
  4. oracle中日期处理方法 汇总
  5. Spring Cloud实战小贴士:Zuul统一异常处理(三)【Dalston版】
  6. Visual studio Code的C/C++开发环境搭建
  7. AE、PR视频压缩导出mp4、mov格式插件:AfterCodecs1.6.1汉化破解版
  8. oracle年龄计算函数
  9. QT5写一个复数计算器(附源码)
  10. python求一元三次方程的根_方程的计算机处理924_Fortran
  11. 百度飞桨AI达人创造营 | Day01:创意是如何诞生的
  12. CSS布局之——左边、上边固定,内容自适应(Vue)
  13. MTK,QAC运用minicom和tftp进行uboot
  14. python怎么批量下载年报_如何使用python批量下载统计年鉴中的excel网页?
  15. matlab里颜色直方图的画法
  16. IOS APP开发:苹果app从开发到上架教程详解
  17. 本周大新闻|128GB版Quest 2再降价,Mojo Vision完成“新A轮”融资
  18. java三层架构的好处,java三层架构原理与作用小结
  19. 访谈李开复:谁主宰微软未来
  20. oracle数据库时,Oracle数据库夏令时问题解答

热门文章

  1. 在重庆如何利用NFC给一卡通充值
  2. 视频转二维码怎么操作?简单一步在线生成视频二维码
  3. 全球及中国光电吊舱应用前景与投资可行性研究报告2022~2027年
  4. Java 上传图片MultipartFile
  5. PyTorch图神经网络实践(六)组合优化问题
  6. websphere Error 404:SRVE0190E
  7. Cesium中实时显示经纬度及视角高
  8. 【JavaSE入门】:Java运算符及进制转换
  9. 【rustdesk】rust入门及 windows 客户端尝试编译
  10. 计算机文档分页怎么办,word文档怎么删除分页符