13_冒泡算法

一、基本介绍

​ 冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。

​ 因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。(这里说的优化,可以在冒泡排序写好后,在进行)

二、图示冒泡排序

三、冒泡排序应用实例

3.1 说明冒泡排序过程

举一个具体的案例来说明冒泡排序法。我们将五个无序的数:3、9、-1、10、-5,使用冒泡排序法将其排成一个从小到大的有序数列

原始数组:3, 9, -1, 10, -5第一趟排序
(1)  3, 9, -1, 10, -5   // 如果相邻的元素逆序就交换
(2)  3, -1, 9, 10, -5
(3)  3, -1, 9, 10, -5
(4)  3, -1, 9, -5, 10第二趟排序
(1) -1, 3, 9, -5 10 //交换
(2) -1, 3, -5, 9, 10
(3) -1, 3, -5, 9, 10第三趟排序
(1) -1, 3, -5, 9, 10
(2) -1, -5, 3, 9, 10第四趟排序
(1) -5, -1, 3, 9, 10

小结冒泡排序规则:

  • 一共进行 (arr.length - 1) 次大的循环;
  • 每一趟排序的次数在逐渐减少;
  • (如果我们发现在某趟排序中,没有发生一次交换,可以提前结束冒泡排序(优化);

3.2 代码展示冒泡排序的演变过程

//展示冒泡排序的演变过程
//第一趟排序,将最大的数排在最后
for (int i = 0; i < arr.length - 1; i++) {//如果前面的数比后面的数大则交换if (arr[i] > arr[i + 1]){arr[i] = arr[i] + arr[i + 1];arr[i + 1] = arr[i] - arr[i + 1];arr[i] = arr[i] - arr[i + 1];}
}
System.out.print("第一趟排序后的数组:");
System.out.println(Arrays.toString(arr));
System.out.println("-------------");//第二趟排序,将第二大的数排在倒数第二个位置
for (int i = 0; i < arr.length - 1 - 1; i++) {//如果前面的数比后面的数大则交换if (arr[i] > arr[i + 1]){arr[i] = arr[i] + arr[i + 1];arr[i + 1] = arr[i] - arr[i + 1];arr[i] = arr[i] - arr[i + 1];}
}
System.out.print("第二趟排序后的数组:");
System.out.println(Arrays.toString(arr));
System.out.println("-------------");//第三趟排序,将第三大的数排在倒数第三个位置
for (int i = 0; i < arr.length - 1 - 1 - 1; i++) {//如果前面的数比后面的数大则交换if (arr[i] > arr[i + 1]){arr[i] = arr[i] + arr[i + 1];arr[i + 1] = arr[i] - arr[i + 1];arr[i] = arr[i] - arr[i + 1];}
}
System.out.print("第三趟排序后的数组:");
System.out.println(Arrays.toString(arr));
System.out.println("-------------");//第四趟排序,将第四大的数排在倒数第四个位置
for (int i = 0; i < arr.length - 1 - 1 - 1 - 1; i++) {//如果前面的数比后面的数大则交换if (arr[i] > arr[i + 1]){arr[i] = arr[i] + arr[i + 1];arr[i + 1] = arr[i] - arr[i + 1];arr[i] = arr[i] - arr[i + 1];}
}
System.out.print("第四趟排序后的数组:");
System.out.println(Arrays.toString(arr));

3.3 冒泡排序代码实现

//冒泡排序的时间复杂度 O(n^2)
for (int i = arr.length - 1; i > 0; i--) {for (int j = 0; j < i; j++) {//如果前面的数比后面的数大则交换if (arr[j] > arr[j + 1]){arr[j] = arr[j] + arr[j + 1];arr[j + 1] = arr[j] - arr[j + 1];arr[j] = arr[j] - arr[j + 1];}}System.out.print("第" + (arr.length - i) + "趟排序后的数组:");System.out.println(Arrays.toString(arr));
}System.out.print("冒泡排序后的数组:");
System.out.println(Arrays.toString(arr));

3.4 冒泡排序优化

//冒泡排序的时间复杂度 O(n^2)
boolean flag = false;   //标识变量,表示是否进行过交换
for (int i = arr.length - 1; i > 0; i--) {for (int j = 0; j < i; j++) {//如果前面的数比后面的数大则交换if (arr[j] > arr[j + 1]){flag = true;arr[j] = arr[j] + arr[j + 1];arr[j + 1] = arr[j] - arr[j + 1];arr[j] = arr[j] - arr[j + 1];}}System.out.print("第" + (arr.length - i) + "趟排序后的数组:");System.out.println(Arrays.toString(arr));if (!flag){//在一趟排序中,一次交换都没有发生break;}else {flag = false;   //重置false,进行下次判断}
}

四、完整java代码

public class BubbleSort {public static void main(String[] args) {int[] arr = {3,9,-1,10,-5};System.out.println("冒泡排序前的数组:" + Arrays.toString(arr));bubbleSort(arr);System.out.print("冒泡排序后的数组:");System.out.println(Arrays.toString(arr));}//将冒泡排序算法,封装成一个方法public static void bubbleSort(int[] arr){//冒泡排序的时间复杂度 O(n^2)boolean flag = false;   //标识变量,表示是否进行过交换for (int i = arr.length - 1; i > 0; i--) {for (int j = 0; j < i; j++) {//如果前面的数比后面的数大则交换if (arr[j] > arr[j + 1]){flag = true;arr[j] = arr[j] + arr[j + 1];arr[j + 1] = arr[j] - arr[j + 1];arr[j] = arr[j] - arr[j + 1];}}System.out.print("第" + (arr.length - i) + "趟排序后的数组:");System.out.println(Arrays.toString(arr));if (!flag){//在一趟排序中,一次交换都没有发生break;}else {flag = false;   //重置false,进行下次判断}}}
}

13_冒泡算法(附完整java代码)相关推荐

  1. java 对音频文件降噪_(转)音频降噪算法 附完整C代码

    转:https://www.cnblogs.com/cpuimage/p/8905965.html 降噪是音频图像算法中的必不可少的. 目的肯定是让图片或语音 更加自然平滑,简而言之,美化. 图像算法 ...

  2. 音频降噪算法 附完整C代码

    本文转载自博客:https://cloud.tencent.com/developer/article/1117226 降噪是音频图像算法中的必不可少的. 目的肯定是让图片或语音 更加自然平滑,简而言 ...

  3. 果蝇(FOA)优化算法(附完整Matlab代码,可直接复制)

    果蝇优化算法的核心是利用果蝇搜索实物的机制来对问题进行寻优.果蝇根据气味来确定食物的位置,食物腐烂程度越高,气味越大,果蝇对其越敏感.果蝇的觅食行为如下图: Fig1. 果蝇觅食行为示意图 1.果蝇位 ...

  4. wav文件降噪c语言,音频降噪算法 附完整C代码

    降噪是音频图像算法中的必不可少的. 目的肯定是让图片或语音 更加自然平滑,简而言之,美化. 图像算法和音频算法 都有其共通点. 图像是偏向 空间 处理,例如图片中的某个区域. 图像很多时候是以二维数据 ...

  5. java mp3静音检测,音频自动增益 与 静音检测 算法 附完整C代码

    前面分享过一个算法<音频增益响度分析 ReplayGain 附完整C代码示例> 主要用于评估一定长度音频的音量强度, 而分析之后,很多类似的需求,肯定是做音频增益,提高音量诸如此类做法. ...

  6. 基于傅里叶变换的音频重采样算法 (附完整c代码)

    前面有提到音频采样算法: WebRTC 音频采样算法 附完整C++示例代码 简洁明了的插值音频重采样算法例子 (附完整C代码) 近段时间有不少朋友给我写过邮件,说了一些他们使用的情况和问题. 坦白讲, ...

  7. 音频自动增益 与 静音检测 算法 附完整C代码

    前面分享过一个算法<音频增益响度分析 ReplayGain 附完整C代码示例> 主要用于评估一定长度音频的音量强度, 而分析之后,很多类似的需求,肯定是做音频增益,提高音量诸如此类做法. ...

  8. 自动曝光修复算法附完整C代码

    众所周知, 图像方面的3A算法有: AF自动对焦(Automatic Focus) 自动对焦即调节摄像头焦距自动得到清晰的图像的过程 AE自动曝光(Automatic Exposure) 自动曝光的是 ...

  9. 基于rnn的语音降噪matlab,基于RNN的音频降噪算法 (附完整C代码)

    前几天无意间看到一个项目rnnoise. 基于RNN的音频降噪算法. 采用的是 GRU/LSTM 模型. 阅读下训练代码,可惜的是作者没有提供数据训练集. 不过基本可以断定他采用的数据集里,肯定有ur ...

最新文章

  1. fatal error LNK1169: 找到一个或多个多重定义的符号
  2. 全球500强案例精选,带你了解人工智能在金融行业如何落地
  3. Redis Cluster 原理你了解不?
  4. 高性能IO -Reactor模式的实现
  5. static_cast函数
  6. 基于JSON Web Tokens的单点登录(SSO)或通行证(Passport)系统方案
  7. Linux 复习重点目录
  8. MFC实现mysql备份_MySQL如何自动备份 - MySQL - VC中文网-VC-MFC编程论坛 - Powered by Discuz!...
  9. java虚拟机内存告警_java虚拟机内存溢出各种场景总结
  10. 软件测试经典面试题(二)给你一个网站如何测试
  11. qt 限制一段时间内对button只能点按一次_299元入手拓牛智能垃圾桶,用第一次想退货,第三天我上瘾了...
  12. 第k小元素——分治法
  13. 计算机软件专业代码表,2019-04-09 计算机软件适用的国民经济行业代码表
  14. python123汉诺塔实践_python汉诺塔问题
  15. SCTP协议与程序设计案例
  16. Pigeon中的流量限制
  17. 原相机怎么设置水印_原来手机拍照也可以添加文字、水印、超实用,我怎么没有早点发现...
  18. 学习资料怎么打印,能用手机直接打印学习资料
  19. 报表工具使用教程-FineReport决策报表导出Plus
  20. python计算bmi的编程_Python学习-计算BMI的小程序

热门文章

  1. 欢迎注册和登陆我们的学海灯塔
  2. Ubuntu Server 20.04 安装桌面(图形界面) 以及 远程桌面
  3. 用Python提取CSDN灌水乐园的帖子
  4. 杂项:MIME(多用途互联网邮件扩展类型)百科
  5. 解析dump的几种方式
  6. 初识linux之vim工具与bdb调试工具
  7. hashcat学习笔记0 安装与例子
  8. 微信小程序实现两数相加
  9. 为什么香肠能激活手机屏幕,手套不能
  10. Spark的spark-*和blockmgr-*目录里是什东西,怎么来的