文章目录

  • 1 冒泡排序简介
  • 2 图解算法
  • 3 冒泡排序代码实现
  • 4 冒泡排序算法的优化
  • 写在最后

1 冒泡排序简介

冒泡排序(Bubble Sorting)即:通过对待排序的序列从前往后,依次比较相邻元素的值,若发现逆序则交换位置,使较大的元素逐渐移动到后部,就像水底的气泡一样逐渐从水面冒出来,这就是冒泡名称的由来。


2 图解算法

以将序列{3, 9, -1, 10, -20}从小到大排序为例!
基本思想就是,在每一趟排序实现将最大的数移到序列的最后端!这主要通过比较相邻两个元素实现,当相邻的两个元素逆序的时候,我们就交换它们。

第1趟排序:
第1趟排序共比较了4次,将最大的数10冒泡到了序列的尾部。

第2趟排序:
由于第一趟排序已经将最大是数10给冒泡到了最末端,因此在本次排序中,不需要再比较最后一个元素,故共比较了3次,将子序列(前四个元素)中最大的数9(整个序列中倒数第二大的数)冒泡到了子序列的尾端(原序列的倒数第二个位置)。

第3趟排序:
在第三趟排序时,同理,倒数两个元素位置已经确定,即第一、第二大的数已经排好位置,只需要再将倒数第三大的数确认即可。故比较2次,实现倒数第三大的数3的位置确定。

第4趟排序:
在第四趟排序时,只有第一、第二个元素的位置还不确定,只需要比较一次,若逆序,则交换即可。到此,排序算法完成,原序列已经排序成为一个递增的序列!

小结

  • 一共进行了数组大小-1次趟排序,即外层循环arr.length-1次;
  • 每趟排序进行了逐趟减小次数的比较,即内层循环arr.length-i-1次,i从0依次增加。

3 冒泡排序代码实现

参考代码如下,为了便于观察结果,在循环中添加了相应的输出语句:

import java.util.Arrays;/*** @author 兴趣使然黄小黄* @version 1.0* 冒泡排序*/
public class BubbleSort {public static void main(String[] args) {int[] array = {3, 9, -1, 10, -20};//排序前System.out.println("排序前:" + Arrays.toString(array));//冒泡排序for (int i = 0; i < array.length - 1; i++) {System.out.println("第" + (i+1) + "趟排序开始!");for (int j = 0; j < array.length - i - 1; j++) {//如果前面的数比后面的数大,则交换if(array[j] > array[j+1]){//交换int temp = array[j];array[j] = array[j+1];array[j+1] = temp;}System.out.println("------第" + (j+1) + "趟排序: " + Arrays.toString(array));}System.out.println("第" + (i+1) + "趟排序完成: " + Arrays.toString(array));System.out.println("================================================");}//输出排序后的结果System.out.println("排序后:" + Arrays.toString(array));}
}

实现结果:

4 冒泡排序算法的优化

举个例子,将待排序的序列改为:{5,1,2,3,4},用以上算法来处理,观察一下结果:

可以发现,当第一趟排序结束的时候,序列已经排序完成: 即将5冒泡到了最后,序列实现了从小到大排序。但是原冒泡排序算法,还是义无反顾的进行了数组大小-1趟排序(我可真是大冤种!)

因此,我们需要尝试对算法进行优化!
发现:在冒泡排序的过程中,各个元素都在不断的接近自己的位置,如果下一趟比较中没有进行过任何交换,则说明序列已经有序, 则排序算法已经可以返回结果。因此,考虑在排序算法过程中添加一个标志flag判断元素是否进行过交换,以减少不必要的冤种行为!

优化代码如下:

import java.util.Arrays;/*** @author 兴趣使然黄小黄* @version 1.0* 冒泡排序优化*/
public class BubbleSort {public static void main(String[] args) {int[] array = {5, 1, 2, 3, 4};//排序前System.out.println("排序前:" + Arrays.toString(array));boolean flag = false; //用于标记是否进行了交换,true则说明进行了交换,false表示无//冒泡排序for (int i = 0; i < array.length - 1; i++) {System.out.println("第" + (i+1) + "趟排序开始!");for (int j = 0; j < array.length - i - 1; j++) {//如果前面的数比后面的数大,则交换if(array[j] > array[j+1]){//交换flag = true; //标记进行了交换int temp = array[j];array[j] = array[j+1];array[j+1] = temp;}System.out.println("------第" + (j+1) + "趟排序: " + Arrays.toString(array));}System.out.println("第" + (i+1) + "趟排序完成: " + Arrays.toString(array));System.out.println("================================================");if (!flag){//如果没有进行交换则直接退出,说明排序已经完成break;}else {//回退flag = false;}}//输出排序后的结果System.out.println("排序后:" + Arrays.toString(array));}
}

四趟排序,优化成了只需要两趟排序!又是一个不可多得的小技巧!在算法程序题中,flag的设置是一种常用的编程思想,常常用于回溯算法中,小伙伴们要学会举一反三~


写在最后

本文被 Java数据结构 收录点击订阅专栏 , 持续更新中。
 创作不易,如果你有任何问题,欢迎私信,感谢您的支持!

排序算法图解(一):冒泡排序与冒泡排序的优化相关推荐

  1. 【十大排序算法】(一)冒泡排序算法(优化)

    一.优化第一版 优化第一版是针对类似 int[] arr = {3,2,1,4,5,6,7,8,9; 这样的有很多已经排好序的数组,为了不让它做无用的循环,对于此场景进行的优化,优化代码如下: // ...

  2. 排序算法图解(四):希尔排序

    文章目录 1 希尔排序简介 2 希尔排序算法图解 3 希尔排序代码实现 写在最后 1 希尔排序简介 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法,其也是一种特殊的插入排序, ...

  3. 抢红包算法 c++_十大排序算法(一):冒泡排序法

    作者:绿皮长条瓜 目录 一.算法介绍 二.MATLAB实现 三.两个例子 一.算法介绍 冒泡排序(Bubble Sort)算法是一种计算科学领域的较简单的排序算法.它重复地走访过要排序的元素列,如果顺 ...

  4. python实现冒泡排序算法的非递归版本_python排序算法速度比较:快速排序,归并排序,冒泡排序...

    前言 原理就不在这里说了,好多大神肯定比我这个初学者讲的好很多,推荐去B站看视频讲解,跟着手敲代码 为什么选这三个排序呢? 首先快排是必须掌握的 看看快排在最坏的情况下(O(n²)),且不使用辅助空间 ...

  5. PHP面试题:请写出常见的排序算法,并用PHP实现冒泡排序,将数组$a = array()按照从小到大的方式进行排序。

    常见的排序算法: 冒泡排序法.快速排序法.简单选择排序法.堆排序法.直接插入排序法.希尔排序法.合并排序法. 冒泡排序法的基本思想是:对待排序记录关键字从后往前(逆序)进行多遍扫描,当发现相邻两个关键 ...

  6. 八大排序算法(java实现) 冒泡排序 快速排序 堆排序 归并排序 等

    八大排序算法 一.直接插入 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度 二.希尔排序 - 1.基本思路 - 2.代码实现 - 3.时间复杂度和空间复杂度 三.简单选择 - 1. ...

  7. python选择排序算法图解_python基本算法之实现归并排序(Merge sort)

    0.前言 评判一个算法的好坏的标准: 时间复杂度 空间复杂度 1.归并排序算法是什么? 冒泡排序(Bubble Sort)是一种建立在归并操作上面的一种有效的排序算法,由John von neuman ...

  8. 十大排序算法 图解 (pythonjava)

    作者 | 不该相遇在秋天 转载自五分钟学算法(ID:CXYxiaowu) 注: 原文使用 java 编程语言,这里我扩展使用 python. 文章目录 No.1 冒泡排序 图解冒泡排序 代码实现 No ...

  9. 数据结构七大排序算法图解

    系列文章整合 排序是计算机程序设计中一个非常重要的操作,它将一个数据元素(或记录)的任意序列重新排列成一个按关键字有序的序列,在有序的序列中查找元素的效率很高,但是无序序列只能逐一查找,因此,如何进行 ...

  10. python选择排序算法图解_简单选择排序算法(C语言详解版)

    该算法的实现思想为:对于具有 n 个记录的无序表遍历 n-1 次,第 i 次从无序表中第 i 个记录开始,找出后序关键字中最小的记录,然后放置在第 i 的位置上. 例如对无序表{56,12,80,91 ...

最新文章

  1. win下我的windows键失效了
  2. 【实用】SAP MR8M校验增强
  3. JAVA中String类的intern()方法的作用
  4. Zbrush学习指南—小白也能学会得雕刻软件
  5. Keepalived + Nginx 实现高可用 Web 负载均衡
  6. chkconfig命令及的使用 与linux的七个运行级别
  7. laydate报Uncaught TypeError: Cannot read property 'appendChild' of undefined
  8. 【sklearn第六讲】特征提取(下)
  9. GEE开发之Landsat8_NDVI的数据分析
  10. 关于扩散模型(Diffusion Models)中的P2-weighting使用防坑
  11. 哪些企业可以做知识产权贯标,你不得不了解的事!
  12. 道高一尺魔高一丈,记强大的boost regex
  13. Docker进入容器报错
  14. 基于红外遥控的arduino遥控小车
  15. Unity录屏插件Recorder
  16. JDK与JER的区别
  17. 永中科技破产拍卖为何无效?
  18. 应用商店审核指南(中文版)
  19. 09、汇编语言程序的调试
  20. 一段时间有几个星期几

热门文章

  1. 怎样将int转换为byte
  2. Linux 如何查看文件夹的大小
  3. 关于软件开发的那些事(三):聊聊软件项目管理及成本核算
  4. poEdit: Windows下的.po文件编辑器
  5. miuiv13-redmi-note11TPro-root
  6. mac 如何安装 wget
  7. 互盾科技:智慧源于勤奋,伟大出自平凡
  8. 消息中间件TongLinkQ(TLQ)使用总结——记那几天趟过的坑
  9. 网站建设备案和不备案的一些疑惑问题大全
  10. python脚本打包成exe+配置文件