排序算法之 冒泡排序 及其时间复杂度和空间复杂度
冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。
算法分析
冒泡排序算法是所有排序算法中最简单的(前面也提到过),在生活中应该也会看到气泡从水里面出来时,越到水面上气泡就会变的越大。在物理上学气压的时候好像也看到过这种现象;其实理解冒泡排序就可以根据这种现象来理解:每一次遍历,都把大的往后面排(当然也可以把小的往后面排),所以每一次都可以把无序中最大的(最小)的元素放到无序的最后面(或者说有序元素的最开始);
基本步骤:
- 外循环是遍历每个元素,每次都放置好一个元素;
- 内循环是比较相邻的两个元素,把大的元素交换到后面;
- 等到第一步中循环好了以后也就说明全部元素排序好了;
代码实现
#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;所以该算法中空间复杂度一般是看交换元素时所使用的辅助空间;
- a = a + b; b = a - b; a = a - b;
- a = a * b; b = a / b; a = a / b;
- a = a ^ b; b = a ^ b;a = a ^ b;
上面几种方法都可以不使用临时空间来交换两个元素,但是都有些潜在的问题,比如 越界;所以个人觉得还是老老实实的用个临时变量吧,这样算法意图就比较清晰了。
作者:常赛峥
来源:CSDN
原文:https://blog.csdn.net/YuZhiHui_No1/article/details/44339711
版权声明:本文为博主原创文章,转载请附上博文链接!
排序算法之 冒泡排序 及其时间复杂度和空间复杂度相关推荐
- 常见排序算法及其对应的时间复杂度、空间复杂度
常见排序算法及其对应的时间复杂度.空间复杂度: 排序算法经过长时间演变,大体可以分为两类:内排序和外排序.在排序过程中,全部记录存放在内存,则成为内排序:如果排序过程中需要使用外存,则称为外排序,本文 ...
- 常见排序算法及对应的时间复杂度和空间复杂度
排序算法经过了很长时间的演变,产生了很多种不同的方法.对于初学者来说,对它们进行整理便于理解记忆显得很重要.每种算法都有它特定的使用场合,很难通用.因此,我们很有必要对所有常见的排序算法进行归纳. 排 ...
- 排序算法之 归并排序 及其时间复杂度和空间复杂度
在排序算法中快速排序的效率是非常高的,但是还有种排序算法的效率可以与之媲美,那就是归并排序:归并排序和快速排序有那么点异曲同工之妙,快速排序:是先把数组粗略的排序成两个子数组,然后递归再粗略分两个子数 ...
- 堆排序重建堆的时间复杂度_排序算法之 堆排序 及其时间复杂度和空间复杂度-Go语言中文社区...
堆排序是由1991年的计算机先驱奖获得者.斯坦福大学计算机科学系教授罗伯特.弗洛伊德(Robert W.Floyd)和威廉姆斯(J.Williams)在1964年共同发明了的一种排序算法( Heap ...
- 冒泡和快速排序的时间复杂度_常用排序算法之冒泡排序
周末无事,带娃之余看到娃娃在算数,想到了排序-尝试着把几种常用的排序算法跟大家聊一聊,在分析的后面我会用GoLang.PHP和JS三种语言来实现下. 常见的基于选择的排序算法有冒泡排序.插入排序.选择 ...
- 排序 时间倒序_经典排序算法之冒泡排序(Bubble Sort)
冒泡排序 ( Bubble Sort ) 冒泡排序,正如它的名字一样,未排序数组中的最大(小)值会依次往上浮.冒泡排序主要有两个基本步骤:相邻元素之间的比较 和 交换位置. 步骤分析: 令待排序序列为 ...
- 排序算法:冒泡排序、插入排序、选择排序、希尔排序
相关博客: 排序算法:冒泡排序.插入排序.选择排序.希尔排序 排序算法:归并排序.快速排序 排序算法:桶排序.计数排序.基数排序 排序算法:堆排序 十大排序算法小结 一.冒泡排序: 1.算法原理: 冒 ...
- 排序算法--(冒泡排序,插入排序,选择排序,归并排序,快速排序,桶排序,计数排序,基数排序)
一.时间复杂度分析 - **时间复杂度**:对排序数据的总的操作次数.反应当n变化时,操作次数呈现什么规律 - **空间复杂度**:算法在计算机内执行时所需要的存储空间的容量,它也是数据规模n的函数. ...
- golang 排序_常用排序算法之冒泡排序
周末无事,带娃之余看到娃娃在算数,想到了排序-尝试着把几种常用的排序算法跟大家聊一聊,在分析的后面我会用GoLang.PHP和JS三种语言来实现下. 常见的基于选择的排序算法有冒泡排序.插入排序.选择 ...
最新文章
- 关于API文档浏览神器Dash
- 安装LPC55S69 MicroPython模块是遇到的CDC Interface驱动问题
- 23、Java Swing JTree:树组件
- pycharm+python+bootstrap写一个登陆界面_Python--day56(前后台数据交互、bootstrap)
- 深度学习数据自动编码器_如何学习数据科学编码
- SQLServer技巧
- Thrift源码学习二——Server层
- mysql 5.7 内存占用_MySQL 5.7 内存使用计算
- arm板配置ssh服务
- 计算机应用基础网课试题及答案2020,2019-2020年度公共课计算机应用基础考试试题附答案(5页)-原创力文档...
- 测试测量 | 【一】如何实现生产过程中的自动化测试?——成功的自动测试系统的目标及面临的问题
- 基于Halcon学习的新能源车牌识别【三】
- 2022 年第十二届 MathorCup 高校数学建模挑战赛思路
- 在UE4中实现撤销(Undo)和重做(Redo)功能
- bdd 启动 data processing进程报错 Can't locate LWP.pm in @INC
- 加密数字货币的开发技术介绍
- mongoDB设置用户名密码
- 计算机计算资产分析表,财务指标计算公式excel,用EXCEL做财务指标分析,如何使用其他工作簿做公式计算??...
- 显式类型转换和隐式类型转换区别?
- 基于JavaEE的网上水果销售管理系统