冒泡排序

Bubble Sort的复杂度分析

什么是复杂度?

简单的来说当我们需要衡量算法的优异程度的时候就需要用到它。。。

对一个算法来说,我们一般用时间和空间这两个维度来衡量它。也就是算法的执行时间,以及算法需要占用多大的空间。。。

我们一般用O来表示复杂度。。。。

而O也有一项特殊的能力它能舍弃一个算法的所有低次项与常数,比如说有一个算法的复杂度为7n3+n2+n+7{7n^3+n^2+n+7}7n3+n2+n+7,那么当我们需要表述他的复杂度的时候就可以说这个算法的时间复杂度为O(n3{n^3}n3)。也就是说可以删除n2+n+7{n^2+n+7}n2+n+7 和常数7。

冒泡排序的时间复杂度O(n2{n^2}n2)
我们一般用最坏时间复杂度来衡量算法,所以一般所有算法时间复杂度说的都是最坏时间复杂度。

时间复杂度分析

而时间复杂度又分为

  • 最坏时间复杂度
  • 平均时间复杂度
  • 最优时间复杂度

冒泡排序的最坏时间复杂度O(n2{n^2}n2)

首先因为冒泡排序需要遍历数组中的所有数字所以这个时间就是n,举个例子如果你的数组是5个数字如[5,8,7,9,4],那么这个n就是5,也就是说这个时间n实际上就是步骤即计算机执行步骤n,遍历一个长度为5的数组至少需要5个步骤。

第二步以从小到大排列举例,对比相邻的两个数字如果第一个数字比第二个数字大那么就交换两个数字的位置反之对比下一个相邻的数字,直到将所有相邻的数字都进行了一边对比了一遍那么这个数组中最大的数字就在最右边,因为对每个数字都对比了一遍所以这个时间就是n-1,因为每个数字都不跟自己进行对比所以需要减一。所以它的执行步骤就是n-1

 举个例子如[5,8,7,9,4]第一次执行遍历对比5<8不动8>7交换8与7的位置数组就变成[5,7,8,9,4],之后对比8<9不动9>4交换9与4的位置数组就变成[5,7,8,4,9]这样这个数组的最大的值9就到最右边了。这样最后这个数字就不用考虑了。第二次执行遍历对比5<7不动7<8不动8>4交换8与4的位置数组变成[5,7,4,8,9]第三次执行遍历对比5<7不动7>4交换7与4的位置数组变成[5,4,7,8,9]第四次执行遍历对比5>4交换5与4的位置数组变成[4,5,7,8,9]这样就排列完毕了。。。。

将上面两个步骤结合起来就是n(n-1)也就是n2−n{n^2-n}n2−n 所以我们同过O进行表述的时候就是冒泡排序的最坏时间复杂度O(n2{n^2}n2)。

因为是最坏时间复杂度需要考虑全部情况。那么那个五个数字的数组进行排序的最坏的情况就是需要对比他们的每一个数字即5*5也就说需要对比25次才能将数组排列整齐。。。。。

冒泡排序的平均时间复杂度O(n2{n^2}n2)

这个我们倒是不经常提一般都是取最优和最坏的平均情况就是n2{n^2}n2,这个平均时间复杂度是指冒泡排序在进行编程的时候有一定的优化空间,比如当对比到一半的时候发现数组就已经排好序了。这个时候就可以编程跳出这个遍历对比的循环了。。。。

不过因为对比遍历的数量级就放在那里所以平均也是n*n这个数量级,所以平均也是这个O(n2{n^2}n2)

冒泡排序的最优时间复杂度O(n{n}n)

这个就是我在进行冒泡排序的最好情况,就是遍历一次就能排好数组的顺序。因为实际上这种情况也是出现比较少,所以这个最优的时间复杂度也不会被纳入实际的情况的考虑范围这个了解一下就可以了。

空间复杂度分析

冒泡排序的空间复杂度O(n{n}n)

空间复杂度这个提的也是非常的少,因为在高速发展的今天我们常常会使用空间换时间的方法来提高我们的效率。基本上很少有人会提及空间,平时我们所说的算法的复杂度一般都是在说最坏时间复杂度。

冒泡排序的空间复杂度就是这个数组的长度n,无论是遍历也好对比也好都一定是需要n个位置来存放n个数。举个例子如果你的数组是5个数字如[5,8,7,9,4],那计算机一定是需要5个地方存放这五个数。也就是空间复杂度为n

而冒泡排序又需要一个位置来存放对比前后的数也就是空间复杂度为1

将上面两个结合来看即冒泡排序的空间复杂度为O(n+1{n+1}n+1)也就是说,冒泡排序的空间复杂度为O(n{n}n)。也就是说有5个数字的数组在进行对比的时候一定需要计算机留有6个位置来存放数字。。。。

Bubble Sort的编程实现思路

Bubble Sort的实现思路

这里是从小到大排列,把小改成大切换一下就能得到从大到小的排列算法。。。。。

  1. 在传入数组之后我们首先就需要遍历数组(也就是第一个for循环的作用)
  2. 寻找这个数组中的最大的这个数字将它放到最右边(也就是第二个for循环作用)
  3. 判断数组中的第一个相邻数字的大小如果小于就继续对比下一个相邻的数字反之如果大于交换两个数字的位置
  4. 声明一个中间的位置用来存放调整前后的数(如果没有这个中间变量直接交换了话就会发现小的那个数字被覆盖掉了就丢失了。。。。)
  5. 将数组中相邻的较大的与较小的在数组中进行位置交换。。。。。。

Bubble Sort的编程

public int[] bubbleSort(int[] array) {int temp;//声明中间变量也就是用于存放相邻的第一个数字防止在交换的过程中数组的第一个位置的数字被覆盖for (int i = 0; i < array.length - 1; i++) {//遍历数组for (int j = 0; j < array.length - 1 - i; j++) {//将最大数字放到最右边if (array[j] > array[j + 1]) {//判断相邻数字是否需要交换temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;//这三行代码用于交换数组中相邻的数字}}}return array;
}
 对比例子思考代码[5,8,7,9,4]第一次执行遍历对比5<8不动8>7交换8与7的位置数组就变成[5,7,8,9,4],之后对比8<9不动9>4交换9与4的位置数组就变成[5,7,8,4,9]这样这个数组的最大的值9就到最右边了。这样最后这个数字就不用考虑了。第二次执行遍历对比5<7不动7<8不动8>4交换8与4的位置数组变成[5,7,4,8,9]第三次执行遍历对比5<7不动7>4交换7与4的位置数组变成[5,4,7,8,9]第四次执行遍历对比5>4交换5与4的位置数组变成[4,5,7,8,9]这样就排列完毕了。。。。

【算法】Bubble Sort(泡式排序)的编程实现思路及其复杂度分析==>冒泡排序相关推荐

  1. 【数据结构与算法】之深入解析“排序链表”的求解思路与算法示例

    一.题目要求 给你链表的头结点 head ,请将其按升序排列并返回排序后的链表. 示例 1: 输入:head = [4,2,1,3] 输出:[1,2,3,4] 示例 2: 输入:h

  2. js排序的时间复杂度_经典排序方法的python实现和复杂度分析

    1.冒泡排序: 冒泡排序算法的运作如下: 比较相邻的元素.如果第一个比第二个大(升序),就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.这步做完后,最后的元素会是最大的数 ...

  3. arraylist从大到小排序_经典排序方法的python实现和复杂度分析

    1.冒泡排序: 冒泡排序算法的运作如下: 比较相邻的元素.如果第一个比第二个大(升序),就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.这步做完后,最后的元素会是最大的数 ...

  4. 排序算法算法之Bubble Sort

    引言 在接下来的一段时间里,我准备整理一下自己的博客.尽自己最大努力把几年前写过的文章都看一遍,把一些存在错误的文章修改一下.把没有必要修改的文章删掉以及把一些知识点不全的文章进行完善.之所以整理自己 ...

  5. 交换排序图解_排序算法(一):初级比较排序

    排序算法,作为算法中最基础的一部分.其中很多思想值得我们学习借鉴,故有必要了解.掌握一些常见常用的排序算法.排序算法根据是否使用比较元素的思想,可分为两大类:比较排序.非比较排序.本文,我们将对比较排 ...

  6. 【排序综合】直接插入排序,希尔排序,快速排序,堆排序,冒泡排序,简单选择排序的简介,实现和算法复杂度分析

    目录 1. 直接插入排序 1.1 直接插入排序简介 1. 什么是直接插入排序 2. 排序思想 1.2 排序实现 1. 排序代码 2. 复杂度分析: 3. 运行结果: 1.3 学习链接 2. 希尔排序( ...

  7. 排序 时间倒序_经典排序算法之冒泡排序(Bubble Sort)

    冒泡排序 ( Bubble Sort ) 冒泡排序,正如它的名字一样,未排序数组中的最大(小)值会依次往上浮.冒泡排序主要有两个基本步骤:相邻元素之间的比较 和 交换位置. 步骤分析: 令待排序序列为 ...

  8. 经典排序算法 - 冒泡排序Bubble sort

    经典排序算法 - 冒泡排序Bubble sort 其原理是比较接近的数字22,按照从小到交换大或降序排列, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头開始进行两两比較交换,直到倒 ...

  9. 算法不会,尚能饭否之排序——冒泡排序(bubble sort)

    这篇博文主要讲的是冒泡排序(Bubble Sort).千万别小看了冒泡排序,去很多的公司面试,上机题很多都是冒泡排序,为什么冒泡排序会成为面试的宠儿呢?这个嘛?其实我也不知道,天知道那些纠结的面试官是 ...

最新文章

  1. 100多篇论文被知网擅自收录!89岁教授维权获赔70余万!
  2. 警惕技术人员的极端性
  3. 一维数组工具 OneArryasTools v1.1(doc生成正常)
  4. 白话解说:阻塞和非阻塞,同步和异步
  5. C10K 非阻塞 Web 服务器
  6. 六十五年来,他的祖国向他道歉了三次
  7. 跟我读论文丨ACL2021 NER BERT化隐马尔可夫模型用于多源弱监督命名实体识别
  8. 智伴机器人广西团队_畅想科技 智绘未来——2020年全区乡村学校少年宫科技体验日活动在广西科技馆举办...
  9. 杭州之行--记杭电网新恩普杯程序设计邀请赛
  10. IIS 7.0与ASP.NET
  11. mpvue学习笔记-之微信数据请求封装
  12. 【Python】发送UDP数据(保姆级图文+附测试工具文件+api例程)
  13. 一篇文章带你搞定数学建模中的 Malthus人口模型(含代码)
  14. Android STB 遥控器适配
  15. wifi678响应超时服务器无应答,Win8宽带连接出现错误678的处理方法
  16. pbootcms建站,pbootcms建站方法技巧
  17. 在SpringBoot项目中,自定义注解+拦截器优雅的实现数据的加解密!
  18. pyspark LEAK: ByteBuf.release() was not called before it's garbage-collected. Enable advanced leak
  19. MySQL 8——学习笔记03(插入、更新、删除 数据 [DML语句]、查询数据 [DQL语句])
  20. 前端项目的总结——为什么要组件化?

热门文章

  1. JAVA2实用教程(第5版)第二章
  2. 从无人货架到智能货柜,无人零售的探索
  3. 2023年PMP考试教材有哪些?(含pmp资料)
  4. 人口生育老龄化政策数据表(1971-2023年)
  5. 尚学堂怎么样?告诉你学渣是怎样成为前端工程师的
  6. 闪聚支付 第3章-C扫B支付
  7. 计算机丢失api-ms-win-crt-runtime-l1-1-0.dll快速解决方案
  8. 【生信】使用QIIME进行 进化树,Alpha,Beta多样性 分析
  9. j2me android ios,NEW UPDATE Opera Mini 6.5 arrives on iOS, Symbian, J2ME and
  10. Linux 查看日志文件命令