目录

1、前言

2、冒泡排序

2.1 算法思路

2.2 代码实现过程:

3、代码优化

3.1 趟数优化

3.2 循环次数优化

3.3 排序完成优化

4、结语


1、前言

我们书接上回,接着数组中的遗留问题来讲解这节的冒泡排序,干货满满,里面还涉及到代码的优化,希望大家有所收获

2、冒泡排序

  • 冒泡排序思想:给定一个数组,让数组升序 (降序) 排序。

2.1 算法思路

  • 假设排升序:
  1. 将数组中相邻元素从前往后依次进行比较,如果前一个元素比后一个元素大,则交换,一趟下来后最大元素就在数组的末尾。
  2. 依次从上上述过程,直到数组中所有的元素都排列好。
  3. 依据这个思想,我们很容易写出如下代码:
public static void main7(String[] args) {int[] array = {10,5,3,7,6};myBubblesort(array);System.out.println(Arrays.toString(array));}public static void myBubblesort(int[] array){for (int i = 0; i < array.length; i++) {for (int j = 0; j < array.length-1; j++) {if(array[j] > array[j+1]){int tmp = 0;tmp = array[j];array[j] = array[j+1];array[j+1] = tmp;}}}}

2.2 代码实现过程:

  • 上述代码在我们思路清晰的情况下很容易写出,但是代码是如何实现的呢?
  • 在这里我们主要关注两个点:趟数i和每次循环的次数j

  • 第1趟:i = 0时

当j = 0时,此时array[0] = 10; array[1] = 5;10 > 5,所以执行array[j] = array[j+1]的交换代码(这里交换代码简写,下同),数组变为:{5,10,3,7,6};

当j = 1时,此时array[1] = 10; array[2] = 3;10 > 3,所以执行array[j] = array[j+1]的交换代码,数组变为{5,3,10,7,6};

当j = 2时,此时array[2] = 10; array[3] = 7;10>7,所以执行array[j] = array[j+1]的交换代码,数组变为{5,3,7,10,6};

当j = 3时,此时array[3] = 10; array[4] = 6;10>6,所以执行array[j] = array[j+1]的交换代码,数组变为{5,3,7,6,10};

至此第1趟的内部循环结束,我们将10这个数字排列到数组的末尾,此时j循环了4次,j = 3时停止

我们发现,数组中一共有5个元素,j循环了4次,那么第一个循环条件就是j <array.length - 1;如果不-1的话,j = 4的时候,那么array[j+1]就会越界,因为数组的下标就到4。 所以array.length - 1,是否就有一个条件呢?,答案是否定的(可以做代码优化),我们继续向下执行第2趟。

  • 第2趟:i = 1时

当j = 0时,此时数组是上一趟结束的数组{5,3,7,6,10},此时array[0] = 5; array[1] = 3;5 > 3,所以执行array[j] = array[j+1]的交换代码,数组变为:{3,5,7,6,10};

当j = 1时,此时array[1] = 5; array[2] = 7;5 < 7,所以不执行array[j] = array[j+1]的交换代码,数组还是{3,5,7,6,10};

当j = 2时,此时array[2] = 7; array[3] = 6;7 > 6,所以执行array[j] = array[j+1]的交换代码,数组变为{3,5,6,7,10};

至此第2趟代码就执行完交换了,因为当j = 3的时候,我们比较的是7和10的大小,在第一趟的时候,我们就已经操作完10到数组的末尾了,所以没必要再比较一次

在第2趟中我们将7操作到倒数第二位的指定位置,我们发现内部循环j执行了3次,到j = 2时候停止。 其实到第2趟的时候我们已经排序完成了,但是代码不知道这个事情(这点记下来,可以做代码优化),我们接着执行第3趟

  • 第3趟:i = 2时

当j = 0时,此时数组是上一趟结束的数组{3,5,6,7,10},此时array[0] = 3; array[1] = 5;3 < 5,所以不执行array[j] = array[j+1]的交换代码,数组还是{3,5,6,7,10}。

当j = 1时,此时array[1] = 5; array[2] = 6;5 < 6,所以不执行array[j] = array[j+1]的交换代码,数组还是{3,5,6,7,10}。

至此第3趟的内部循环就结束了,因为如果再往下执行,就要操作7了,但是7我们在第2趟的时候已经操作过了。

在第3趟的内部循环中,是操作了6在倒数第3位的位置,我们发现内部循环j执行了2次,到j = 1时候停止。 数据早就排序好了,但是代码不知道,所以继续第4趟。

  • 第4趟,i = 3时

当j = 0时,此时数组是上一趟结束的数组{3,5,6,7,10},此时array[0] = 3; array[1] = 5;3 < 5,所以不执行array[j] = array[j+1]的交换代码,数组还是{3,5,6,7,10}。

至此第4趟结束了,因为我们要操作的是5这个数字,和3比较完之后,就已经在原来正确的位置了,所以循环结束

在第4趟的内部循环中,是操作了5在倒数第4位的位置,我们发现内部循环j执行了1次,到j = 0时候停止。

注意:我们要不要执行第5趟呢,这个问题放在代码优化中讲解。

3、代码优化

3.1 趟数优化

  • 书接上一节,当我们执行完第四趟的时候,现在只有3一个数字,没有必要再执行一趟,因为其他的数字如果排序完成之后,3自动排序好了,所以趟数可以优化为:i < array.length - 1趟,也就是最后1趟没有必要执行,代码优化如下:
public static void main7(String[] args) {int[] array = {10,5,3,7,6};myBubblesort(array);System.out.println(Arrays.toString(array));}public static void myBubblesort(int[] array){for (int i = 0; i < array.length-1; i++) {for (int j = 0; j < array.length-1; j++) {if(array[j] > array[j+1]){int tmp = 0;tmp = array[j];array[j] = array[j+1];array[j+1] = tmp;}}}}

3.2 循环次数优化

  • 我们发现,第1趟时候,j = 3结束循环;第2趟的时候,j = 2的时候结束循环;第3趟的时候,j = 1结束循环;第4趟的时候,j = 0结束循环。 所以内部循环j可以优化成j < array.length- 1 - i;循环次数减少,代码的运行效率就提高了。代码优化如下:
public static void main7(String[] args) {int[] array = {10,5,3,7,6};myBubblesort(array);System.out.println(Arrays.toString(array));}public static void myBubblesort(int[] array){for (int i = 0; i < array.length-1; i++) {for (int j = 0; j < array.length-i-1; j++) {if(array[j] > array[j+1]){int tmp = 0;tmp = array[j];array[j] = array[j+1];array[j+1] = tmp;}}}}

3.3 排序完成优化

  • 在上述代码中,我们肉眼可见的第2趟的时候就已经排序完成,但是代码并不知道排序完成,还是会继续执行,那么我们有没有办法让代码知道什么时候已经排序完成呢?
  • 我们设置一个标志位flg = false;如果执行交换代码,就把flg = true;如果没有交换代码,就证明排序已经完成。 我们在每一趟,执行或不执行交换代码的后面判断这个标志位,如果flg = true,证明本趟交换了数据,那就执行下一趟;如果flg = false;证明没有执行交换代码,那么本趟就已经排序完成了,就return结束函数即可。 代码优化如下:
   public static void main7(String[] args) {int[] array = 10,5,3,7,6};myBubblesort(array);System.out.println(Arrays.toString(array));}public static void myBubblesort(int[] array){for (int i = 0; i < array.length-1; i++) {boolean flg = false;for (int j = 0; j < array.length-1-i; j++) {if(array[j] > array[j+1]){int tmp = 0;tmp = array[j];array[j] = array[j+1];array[j+1] = tmp;flg = true;}}if(flg == false){return;}}}
  • 注意:flg标志位要放在趟数循环内部,因为每次循环都要把flg = false;否则如果放在循环外部,只要执行过一次交换,flg就为true了,那么就检测不到这趟是否完成了排序。

4、结语

  • 其实,冒泡排序我们本身是不难实现的,但是你能否做到三次代码优化呢?相信看完这次blog你也可以实现。
  • 接下来,博主会更新类与对象的相关内容,期待大家的持续关注!

Java代码实现—冒泡排序相关推荐

  1. 请用java代码实现冒泡排序并输出,深夜思考

    前言 今年互联网形式依旧严峻,再次爆发几次大规模裁员潮.我决定把这篇文章分享出来帮助那些对前途感到迷茫的朋友.根据粉丝投稿的真实经历改编 在现在这个浮躁而又拜金的社会,我相信很多人做技术并非出于热爱, ...

  2. java代码实现冒泡排序

    int []arr={12,3,45,6,2,1};for(int i=0;i<arr.length-1;i++){ //比较的总轮数是元素个数减一for(int j=0;j<arr.le ...

  3. 冒泡排序java代码_面试官问我插入排序和冒泡排序哪个更牛逼?

    (给算法爱好者加星标,修炼编程内功) 来源:小鹿动画学编程,作者:小鹿同学 写在前边 排序对于每个开发者来讲,都多多少少知道几个经典的排序算法,比如我们之前以动画形式分享的冒泡排序,也包括今天要分享的 ...

  4. 买什么数据结构与算法,这里有:动态图解十大经典排序算法(含JAVA代码实现)

    上篇的动图数据结构反响不错,这次来个动图排序算法大全.数据结构与算法,齐了. 几张动态图捋清Java常用数据结构及其设计原理 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: ...

  5. java array 元素的位置_数据结构与算法:动态图解十大经典排序算法(含JAVA代码实现)...

    点击上方"JAVA",星标公众号 重磅干货,第一时间送达 本文将采取动态图+文字描述+正确的java代码实现来讲解以下十大排序算法: 冒泡排序 选择排序 插入排序 希尔排序 归并排 ...

  6. java代码_Java 代码实现排序算法

       阅读本文约需要8分钟  大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了下SpringBoot+Gradle+ MyBa ...

  7. java算法:冒泡排序

    java算法:冒泡排序 冒泡排序:不断遍历文件,交换倒序的相邻元素,直到文件排好顺序.冒泡排序的主要优点是容易实现,冒泡排序通常会比选择排序.插入排序慢. 如,对EXAMPLE 字母进行排序:  E  ...

  8. Java中的冒泡排序,Comparator接口和Comparable接口的简单使用

    冒泡排序 冒泡排序是一种常见的排序方法,按照一定的规则(比如从小到大或者从大到小的顺序)对一组数据进行排序.而在Java开发中,也经常用到冒泡排序.我们就以下面的一个例子来讲解冒泡排序算法. 给定一个 ...

  9. Java数组初始化, 冒泡排序, 查找

    文章目录 数组快速入门 数组的使用 使用方式1 动态初始化 使用方式2 动态初始化 使用方式3 静态初始化 数组使用注意事项和细节 数组赋值机制 数组翻转 数组扩容 排序的介绍 冒泡排序法 数组的查找 ...

  10. 13_冒泡算法(附完整java代码)

    13_冒泡算法 一.基本介绍 ​ 冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前 ...

最新文章

  1. C# 对Excel的样式操作
  2. kubernetes不同的命名空间下的容器能通信吗_超长干货 | Kubernetes命名空间详解
  3. 2020-11-9(intent显式意图和隐式意图)
  4. Table options do not contain an option key ‘connector‘ for discovering a connector
  5. AI+时代,谈谈产品经理对图像识别技术的阈值控制
  6. java 实现按规则自增功能_java运算符详解 - osc_74vaali6的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. qt将光标相对于桌面的位置转换为相对于窗口的位置
  8. nuke无法理解服务器的响应,cuke4nuke服务器没有重新开始
  9. asp.net 2.0中允许一次上传多个文件的设计
  10. 【java】Java泛型
  11. 【Python】Tanimoto相似度算法实现
  12. java 密码加密_Java如何实现密码加密
  13. Google 另类技巧不完全手册
  14. WPF控件模板和数据模板的区别
  15. 机器学习方面的参考论文
  16. 淘宝/天猫获取商品历史价格信息 API
  17. centos7 net-snmp agentx
  18. vue实现动态二维码完成签到功能
  19. python二维表转一维表_【习题】一维表转二维表
  20. 网易云音乐部门技术面

热门文章

  1. mysql垂直分库_mysql垂直分库,水平分库,垂直分表,水平分表
  2. Java从入门到跑路
  3. shellcode之简单的栈溢出实验
  4. Java基础教程——线程局部变量
  5. 关于block的回调使用-防止内存泄露问题
  6. Jsp Layout 布局页
  7. CLR基础---生成、打包、部署和管理应用程序及类型(二)
  8. Open-Unmix - A Reference Implementation for Music Source Separation
  9. 现代语音信号处理之语音信号处理基础
  10. 使用darknet批量测试图片并保存在指定文件夹下