冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。
算法分析
冒泡排序算法是所有排序算法中最简单的(前面也提到过),在生活中应该也会看到气泡从水里面出来时,越到水面上气泡就会变的越大。在物理上学气压的时候好像也看到过这种现象;其实理解冒泡排序就可以根据这种现象来理解:每一次遍历,都把大的往后面排(当然也可以把小的往后面排),所以每一次都可以把无序中最大的(最小)的元素放到无序的最后面(或者说有序元素的最开始);
基本步骤:

  1. 外循环是遍历每个元素,每次都放置好一个元素;
  2. 内循环是比较相邻的两个元素,把大的元素交换到后面;
  3. 等到第一步中循环好了以后也就说明全部元素排序好了;

代码实现

 #include<stdio.h>//打印数组元素void print_array(int *array, int length){int index = 0;printf("array:\n");for(; index < length; index++){printf(" %d,", *(array+index));}   printf("\n\n");}void bubbleSort(int array[], int length){int i, j, tmp;if (1 >= length) return;// 判断参数条件for (i = length-1; i > 0; i--){//外循环,循环每个元素for (j = 0; j < i; j++){  // 内循环,if (array[j] > array[j+1]){// 交换相邻的两个元素tmp        = array[j];array[j]   = array[j+1];array[j+1] = tmp;}   }   }   }int main(void){int array[12] = {1,11,12,4,2,6,9,0,3,7,8,2};print_array(array, 12);bubbleSort(array, 12);print_array(array, 12);return 0;}
---------------------
作者:常赛峥
来源:CSDN
原文:https://blog.csdn.net/YuZhiHui_No1/article/details/44339711
版权声明:本文为博主原创文章,转载请附上博文链接!

运行结果:

时间复杂度
这个时间复杂度还是很好计算的:外循环和内循环以及判断和交换元素的时间开销;
最优的情况也就是开始就已经排序好序了,那么就可以不用交换元素了,则时间花销为:[ n(n-1) ] / 2;所以最优的情况时间复杂度为:O( n^2 );
最差的情况也就是开始的时候元素是逆序的,那么每一次排序都要交换两个元素,则时间花销为:[ 3n(n-1) ] / 2;(其中比上面最优的情况所花的时间就是在于交换元素的三个步骤);所以最差的情况下时间复杂度为:O( n^2 );
综上所述:
最优的时间复杂度为:O( n^2 ) ;有的说 O(n),下面会分析这种情况;
最差的时间复杂度为:O( n^2 );
平均的时间复杂度为:O( n^2 );

空间复杂度
空间复杂度就是在交换元素时那个临时变量所占的内存空间;
最优的空间复杂度就是开始元素顺序已经排好了,则空间复杂度为:0;
最差的空间复杂度就是开始元素逆序排序了,则空间复杂度为:O(n);
平均的空间复杂度为:O(1);

最优时间复杂度 n
有很多人说冒泡排序的最优的时间复杂度为:O(n);其实这是在代码中使用一个标志位来判断是否已经排序好的,修改下上面的排序代码:

 void bubbleSort(int array[], int length){int i, j, tmp;int flag = 1;if (1 >= length) return;for (i = length-1; i > 0; i--, flag = 1){ for (j = 0; j < i; j++){if (array[j] > array[j+1]){tmp        = array[j];array[j]   = array[j+1];array[j+1] = tmp;flag = 0;}   }   if (flag) break;}   }

根据上面的代码可以看出,如果元素已经排序好,那么循环一次就直接退出。或者说元素开始就已经大概有序了,那么这种方法就可以很好减少排序的次数;其实我感觉这种方法也有弊端,比如 要额外的判断下,以及赋值操作;

**

空间复杂度为 0

**
有人会说这个空间复杂度能降到0,因为空间复杂度主要是看使用的辅助内存,如果没有辅助内存变量,那么可以说空间复杂度为0;所以该算法中空间复杂度一般是看交换元素时所使用的辅助空间;

  1. a = a + b; b = a - b; a = a - b;
  2. a = a * b; b = a / b; a = a / b;
  3. a = a ^ b; b = a ^ b;a = a ^ b;

上面几种方法都可以不使用临时空间来交换两个元素,但是都有些潜在的问题,比如 越界;所以个人觉得还是老老实实的用个临时变量吧,这样算法意图就比较清晰了。


作者:常赛峥
来源:CSDN
原文:https://blog.csdn.net/YuZhiHui_No1/article/details/44339711
版权声明:本文为博主原创文章,转载请附上博文链接!

排序算法之 冒泡排序 及其时间复杂度和空间复杂度相关推荐

  1. 常见排序算法及其对应的时间复杂度、空间复杂度

    常见排序算法及其对应的时间复杂度.空间复杂度: 排序算法经过长时间演变,大体可以分为两类:内排序和外排序.在排序过程中,全部记录存放在内存,则成为内排序:如果排序过程中需要使用外存,则称为外排序,本文 ...

  2. 常见排序算法及对应的时间复杂度和空间复杂度

    排序算法经过了很长时间的演变,产生了很多种不同的方法.对于初学者来说,对它们进行整理便于理解记忆显得很重要.每种算法都有它特定的使用场合,很难通用.因此,我们很有必要对所有常见的排序算法进行归纳. 排 ...

  3. 排序算法之 归并排序 及其时间复杂度和空间复杂度

    在排序算法中快速排序的效率是非常高的,但是还有种排序算法的效率可以与之媲美,那就是归并排序:归并排序和快速排序有那么点异曲同工之妙,快速排序:是先把数组粗略的排序成两个子数组,然后递归再粗略分两个子数 ...

  4. 堆排序重建堆的时间复杂度_排序算法之 堆排序 及其时间复杂度和空间复杂度-Go语言中文社区...

    堆排序是由1991年的计算机先驱奖获得者.斯坦福大学计算机科学系教授罗伯特.弗洛伊德(Robert W.Floyd)和威廉姆斯(J.Williams)在1964年共同发明了的一种排序算法( Heap ...

  5. 冒泡和快速排序的时间复杂度_常用排序算法之冒泡排序

    周末无事,带娃之余看到娃娃在算数,想到了排序-尝试着把几种常用的排序算法跟大家聊一聊,在分析的后面我会用GoLang.PHP和JS三种语言来实现下. 常见的基于选择的排序算法有冒泡排序.插入排序.选择 ...

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

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

  7. 排序算法:冒泡排序、插入排序、选择排序、希尔排序

    相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.冒泡排序: 1.算法原理: 冒 ...

  8. 排序算法--(冒泡排序,插入排序,选择排序,归并排序,快速排序,桶排序,计数排序,基数排序)

    一.时间复杂度分析 - **时间复杂度**:对排序数据的总的操作次数.反应当n变化时,操作次数呈现什么规律 - **空间复杂度**:算法在计算机内执行时所需要的存储空间的容量,它也是数据规模n的函数. ...

  9. golang 排序_常用排序算法之冒泡排序

    周末无事,带娃之余看到娃娃在算数,想到了排序-尝试着把几种常用的排序算法跟大家聊一聊,在分析的后面我会用GoLang.PHP和JS三种语言来实现下. 常见的基于选择的排序算法有冒泡排序.插入排序.选择 ...

最新文章

  1. 关于API文档浏览神器Dash
  2. 安装LPC55S69 MicroPython模块是遇到的CDC Interface驱动问题
  3. 23、Java Swing JTree:树组件
  4. pycharm+python+bootstrap写一个登陆界面_Python--day56(前后台数据交互、bootstrap)
  5. 深度学习数据自动编码器_如何学习数据科学编码
  6. SQLServer技巧
  7. Thrift源码学习二——Server层
  8. mysql 5.7 内存占用_MySQL 5.7 内存使用计算
  9. arm板配置ssh服务
  10. 计算机应用基础网课试题及答案2020,2019-2020年度公共课计算机应用基础考试试题附答案(5页)-原创力文档...
  11. 测试测量 | 【一】如何实现生产过程中的自动化测试?——成功的自动测试系统的目标及面临的问题
  12. 基于Halcon学习的新能源车牌识别【三】
  13. 2022 年第十二届 MathorCup 高校数学建模挑战赛思路
  14. 在UE4中实现撤销(Undo)和重做(Redo)功能
  15. bdd 启动 data processing进程报错 Can't locate LWP.pm in @INC
  16. 加密数字货币的开发技术介绍
  17. mongoDB设置用户名密码
  18. 计算机计算资产分析表,财务指标计算公式excel,用EXCEL做财务指标分析,如何使用其他工作簿做公式计算??...
  19. 显式类型转换和隐式类型转换区别?
  20. 基于JavaEE的网上水果销售管理系统

热门文章

  1. 【Excel学习笔记9】冻结窗格、工作簿、工作表、视图
  2. Python全栈开发-数据分析-03 Pandas详解 (下)
  3. 华一汽车告诉你:华一汽车后来居上“三板斧”
  4. Creo9.0 特征的成组
  5. 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 (快速排序partion操作应用)
  6. 三方支付助手-银行卡识别
  7. BIM设计师斑马:从零开始,掌握以Revit为对象的BIM平台
  8. java提供文件下载的方法
  9. 罗伯特议事法则--解读篇
  10. 友情链接互换-乐晨博客官方网站诚邀