起泡排序又称为冒泡排序。它是通过一系列的“交换”动作完成的。首先将第一和第二个记录进行比较,如果第一个记录大于第二个记录,则两者交换位置,否则保持原位置不变;然后比较第二和第三个记录……一直按这种方式比较下去,最终最大的记录被交换到最后,一趟冒泡排序完成。这个过程,大的记录就像一块石头一样“沉底”,小的记录逐渐向上“浮动 ”,冒泡排序的名字也是由此而来的。

冒泡排序的步骤归纳如下(以升序排序为例):

1、依次比较序列中相邻的两个元素 ,将较大的放在后面,这样一趟下来 ,最大的元素就被放到了最后;
2、接着重复第一步,第二趟下来, 第二大的元素就被放到倒数第二的位 置上;
3、依次循环,直到最小的元素被放 在第一个位置上,排序结束。

冒泡排序基本算法实现如下:

//冒泡排序
void bubbleSort(int[] a, int n){int temp;for (int i = 0; i < n; i++) {for (int j = 1; j < n - i; j++) {if (a[j-1] > a[j]) {temp = a[j-1];a[j-1] = a[j];a[j] = temp;}}}
}

java代码实现如下:

public class BubbleSort {public static void main(String[] args) {int[] a = {2,5,9,3,0,4,6};bubbleSort(a,7);bubbleSortAdvanced(a,7);for (int i = 0; i < a.length; i++) {System. out.println(a[i]);}System. out.println("***********" );bubbleSortAdvanced(a,7);for (int i = 0; i < a.length; i++) {System. out.println(a[i]);}}//原始冒泡排序(注意n的取值)public static void bubbleSort(int[] a, int n){int temp;for (int i = 0; i < n; i++) {for (int j = 1; j < n - i; j++) {if (a[j-1] > a[j]) {temp = a[j-1];a[j-1] = a[j];a[j] = temp;}}}}/*** 冒泡排序优化:** 设置一个标志位flag,如果这一趟发生了交换,flag=true,否则flag=false。* 如果有一趟没有发生交换,说明排序已经完成。** 注意n的取值*/public static void bubbleSortAdvanced(int[] a, int n){int temp;boolean flag = true;while(flag){flag = false;for (int i = 0; i < n; i++) {for (int j = 1; j < n; j++) {if (a[j-1] > a[j]) {temp = a[j-1];a[j-1] = a[j];a[j] = temp;flag = true;//如果本趟没有发生数据交换,说明排序已经完成,不再进行比较}}}}}
}

时间复杂度

最坏情况下,待排序列逆序,此时对于外层循环的每次执行,内层循环中if语句的条件a[j-1] > a[j]始终成立,即基本操作执行的次数为n-i。i的取值为1 ~ n-1。因此,基本操作总的执行次数为(n-1+1)(n-1)/2=n(n-1)/2,由此可知时间复杂度为O(n2){n的平方}

最好情况下,待排序列有序,此时内层循环中if语句的条件始终不成立,交换不发生,且内层循环执行n-1次后整个算法结束,时间复杂度为O(n)

综上所述,冒泡排序的平均时间复杂度为O(n2){n的平方}


空间复杂度

由算法代码可以看出,额外辅助空间只有一个temp,因此空间复杂度为0(1)

【大话数据结构算法】冒泡排序相关推荐

  1. 大话数据结构——算法

    算法:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作. 为什么把数据结构和算法一起说? 想想罗密欧与朱丽叶,梁山伯和祝英台,少了一个你总会觉得奇怪吧. ...

  2. 【大话数据结构算法】查找算法

    顺序查找 针对无序序列的一种最简单的查找方式. 算法思想: 从表中第一个记录开始,逐个与给定值进行比较,若某个记录的关键字和给定值相等,则查找成功:反之,若直到最后一个记录,其关键字和给定值都不相等, ...

  3. 【大话数据结构算法】归并排序

    归并排序算法的基本步骤: 1.把0~length-1的数组分成左数组和右数组: 2.对左数组和右数组进行迭代排序: 3.将左数组和右数组进行合并,那么生成的整个数组就是有序的数据数组. 归并排序基本算 ...

  4. 【大话数据结构算法】直接选择排序

    选择类排序的主要动作是"选择",直接选择排序采用最简单的选择方式,从头至尾顺序扫描序列,找出最小的一个记录,和第一个记录交换,接着从剩下的记录中继续这种选择和交换,最终使序列有序. ...

  5. 【大话数据结构算法】直接插入排序

    直接插入排序的基本思想:每趟将一个待排元素作为关键字,按照其关键字值得大小插入到已经排好序的部分序列的适当位置,直到插入完成. 算法思想总结如下:(设待排序的数组为a[0-n-1]) 1.初始时,a[ ...

  6. 【大话数据结构算法】希尔排序

    希尔排序的实质就是分组插入排序,该方法又称为缩小增量排序. 直接插入排序适合于序列基本有序的情况,希尔排序的每趟排序都会使整个序列变得更加有序,等整个序列基本有序了,再来一趟直接插入排序,这样会使排序 ...

  7. 【大话数据结构算法】快速排序算法

    快速排序是交换类的排序,比如在站队的时候,老师说:"第一个同学出列,其他同学以第一个同学为中心,比他矮的全排在左边,比他高的全排在右边."这就是一趟快速排序.可以看出,一趟快速排序 ...

  8. 【大话数据结构算法】哈夫曼树

    哈夫曼树又称为最优二叉树. 1.路径和路径长度 在一棵树中,从一个节点往下可以达到的孩子或者子孙节点之间的通路称为路径.通路中分支的数目称为路径长度.若规定根节点的层数为1,则从根节点 到第L层节点的 ...

  9. 大话数据结构及JAVA数据结构阅读笔记

    目录 一.大话数据结构随书阅读笔记 第一章 数据结构概述 第二章  算法概述 第三章 线性表 第四章 栈与队列 第五章 串 第六章 树 第七章 图 第八章 查找 第九章 排序 二.大话数据结构思维导图 ...

最新文章

  1. swift_007(Swift的Array 数组)
  2. c语言学生成绩查询课设报告,C语言课设报告(学生考试成绩查询程序)【荐】.doc...
  3. 在Java里怎将字节数转换为我们可以读懂的格式?
  4. python 量化交易_基于Python的量化交易工具清单(上)
  5. 2022年中国在线视频行业研究报告
  6. 第二场周赛(递归递推个人Rank赛)——题解
  7. 正则,bs4 ,xpath 和jsonpath 的匹配规则
  8. 《获取Windows中的当前时区列表》
  9. 一树桃红,在生命的枝头葱茏
  10. “毕竟,你胜利了......敬胜利者一杯。”
  11. 利用composer安装依赖
  12. 【数据结构】单链表的实现
  13. linux中pid gid tgid tid的区别和联系
  14. python 动画场景_clarisse电影级CG场景渲染中文教学
  15. visio设置图片默认大小_学习PS第6课(图片大小设置)
  16. linux入门学习(3权限管理)
  17. 怎样与项目中的“怪人”沟通
  18. 布隆过滤器(Bloom Filter)、布谷鸟过滤器(Cuckoo Filter)、商过滤器(quotient filter)(持续更新~~~~)
  19. XWPFDocument 创建Word并且生成目录结构
  20. RFID电子标签有哪些分类

热门文章

  1. 解决 Flex navigateToURL 中文乱码问题
  2. [Oracle]高效的PL/SQL程序设计(三)--Package的优点
  3. Android还在用Toast?你Out啦,该试试Snackbar了
  4. Android studio 设置主题
  5. ASCII + Url + Base64
  6. 浏览器解析编码优先级
  7. Android自定义组合控件--EditText和Button组合成带有清空EditText内容功能的复合控件
  8. USACO翻译:USACO 2014 FEB SILVER 三题
  9. MFC文件打开格式,MFC默认打开文档后缀(支持打开多图像格式)
  10. 使用jquery脚本获取随笔、文章和评论的统计数,自定义显示位置