冒泡排序的核心理念是什么?那就是相邻两数比较,前面的数比后面的数小的话,就交换位置,每次循环找到该次排序的最小值,然后放到该次循环数组的队尾,因此便利到最后,留的就是最大的数.
那么在这里说下冒泡排序的两种写法,一种是从前往后遍历,另一种是从后往前遍历,这两种遍历方式代码如下:

System.out.println("\n_______________________________________________________");//对数组进行循环,每次都是tempArray[i]与tempArray[i+1]进行比较//对第一种排序方式进行统计int count = 0;//对第二种排序方式进行统计int count2 = 0;for (int i = 0;i<tempArray.length-1;i++){//声明tempNum进行中间变量存储int tempNum = -1;int tempNum2 = -1;//第一种排序for (int j = 0;j < (tempArray.length-i-1);j++){//如果tempArray[j]<tempArray[j+1],则置换两个存储位置上的数字//全部轮询过后把最小的放到最后面if (tempArray[j]<tempArray[j+1]){tempNum = tempArray[j];tempArray[j] = tempArray[j+1];tempArray[j+1] = tempNum;}//不变count++;System.out.println("\n经第一种的第"+(count)+"次排序方式,此趟排序后,数组为:");for(int num:tempArray){System.out.print(num+" ");}}//第二种排序,从后往前比较,内部第一轮比较后,可以实现:最小值在最后面,最大值在最前面,所以每次去头去尾比较内部for (int j = (tempArray.length-i-2);j >= i;j--){//如果tempArray[j]<tempArray[j+1],则置换两个存储位置上的数字System.out.println("\n此时第"+(j+1)+"位上的数字跟第"+(j+2)+"位上的数字比较");if (tempArray2[j]<tempArray2[j+1]){tempNum2 = tempArray2[j];tempArray2[j] = tempArray2[j+1];tempArray2[j+1] = tempNum2;System.out.println("第"+(j+1)+"位上的数字与第"+(j+2)+"上的数字交换位置");}count2++;System.out.println("\n经第二种的第"+(count2)+"次排序方式此趟排序后,数组为:");for(int num2:tempArray2){System.out.print(num2+" ");}}}System.out.println("第一种循环次数为:"+count);System.out.println("经过第一种排序后的数组为:");for(int num:tempArray){System.out.print(num+" ");}System.out.println("\n_______________________________________________________");System.out.println("第二种循环次数为:"+count2);//循环次数为(奇数时),(N-1)+(N-2-1)+(N-4-1)+(N-6-1)+...+(N-2n+1)=nN-N²((N=n/2)+1);//循环次数为(偶数时),(N-1)+(N-2-1)+(N-4-1)+(N-6-1)+...+(N-2n+1)=nN-N²(N=n/2);System.out.println("经过第二种排序后的数组为:");for(int num2:tempArray2){System.out.print(num2+" ");}System.out.println("\n_______________________________________________________");

接下来对这两种方法简单分析,其实主要的分析都在代码备注里面,这里再赘述几点:
1.为什么第二种方法取值范围为j = (tempArray.length-i-2)?
答:因为外层循环是从0开始的,所遍历的最大取值下标为tempArray.length-1,又因为每次比较是j的值与j+1的值比较,所以,j+1最大可取到tempArray.length-1则,j最大可取到tempArray.length-2.
2.为什么后序便利比顺序遍历效率高?
答:先序便利,只关注最小值,然后像波浪一样把最小值推到最后面,中间不关注最大值,但是后续遍历时,虽然也是把最小值推到最后,但是在推最小值的同时,最大的值被推到了前面,两级分化,然后第二次大循环就是在抛除了两极的数组进行再次的后序便利,所以效率较高.
3.时间复杂度上两种排序方式的差异.
答:从时间复杂度上来看,第一种先序遍历,当数组有n个数时,所经历的内层循环总数为:(n-1)+(n-2)+…+(n-n)=[n*(n-1)]/2.
第二种后续遍历,当有n个数时,如果n为奇数时:,所经历的的内层循环总数为;(N-1)+(N-2-1)+(N-4-1)+(N-6-1)+…+(N-2n+1)=nN-N²((N=n/2)+1),其中N为数组长度2除以2并且向上取整.,如果n为偶数时:,所经历的的内层循环总数为;(N-1)+(N-2-1)+(N-4-1)+(N-6-1)+…+(N-2n+1)=nN-N²(N=n/2),其中N为数组长度2除以2.
经程序验证输出排序效果:

ps:屏幕长度有限,就随机了三个数进行排序,有需要的可以上本人的GitHub进行代码下载,输入个10000,让随机生成的一万长度的数组进行排序也是没问题的,本文GitHub地址为:https://github.com/zhangruibin/Algorithm/blob/master/src/main/java/com/zhrb/rankAlgorithm/BubbleSort.java
Over!

冒泡排序BubbleSort(两种写法)相关推荐

  1. 冒泡排序及其三种写法

    冒泡排序 冒泡排序是入门级的算法,但也有一些有趣的玩法. 通常来说,冒泡排序有三种写法: 一边比较一边向后两两交换,将最大值/最小值冒泡到最后一位: 经过优化的写法:使用一个变量记录当前轮次的比较是否 ...

  2. 两种写法的效果一样,那么到底哪一种更好呢?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 有时候,我们在写一些循环逻辑的时候,并不是按执行次数等作 ...

  3. Model层的两种写法

    Model层的两种写法 第一种写法 namespace MyMVC.Models {public class Child{ //属性private int id;public int Id{get { ...

  4. controller 有两种写法,讨论一下两种写法的区别:

    controller 有两种写法,讨论一下两种写法的区别: 写法 1: app.controller('myCtrl', function($scope, $location) { $scope.my ...

  5. Sql语句中 case when .. 的两种写法

    在 SQL查询语句中, case 语句的两种写法(SqlServer 2005 下测试通过): 1. select (case 字段1  when a then 0  when b then 1  e ...

  6. 20210408:力扣(二分查找法的两种写法以及变体题目)

    二分查找法的两种写法以及变体题目 写在前面 题目 思路与算法 代码实现 写在最后 写在前面 关于二分查找,真的是一个非常实用的查找算法,主要有两种写法,今天在总结时再次碰到,再次整理,方便后续查看复习 ...

  7. python装饰器带参数函数_python带参数装饰器的两种写法

    python带参数装饰器的两种写法 前言 最近在实现一个装饰器的过程中发现了一个很有意思的地方,在博客里面分享出来 不同的写法 三层函数嵌套,实现了可传参数的一个装饰器. import logging ...

  8. sum 去重_总结leetcode上【排列问题】【组合问题】【子集问题】回溯算法去重的两种写法!...

    本周小结!(回溯算法系列三)续集 在 本周小结!(回溯算法系列三) 中一位录友对 整颗树的本层和同一节点的本层有疑问,也让我重新思考了一下,发现这里确实有问题,所以专门写一篇来纠正,感谢录友们的积极交 ...

  9. Vue2基础-el与data的两种写法(HTML版)

    目录 一.el的2种写法 二.data的2种写法 三. 一个重要的原则 Vue2基础全套教程合集:点击跳转        Vue2高级全套教程合集:点击跳转 一.el的2种写法 new Vue时候配置 ...

最新文章

  1. union all与空字段的一种用法
  2. linux下配置oracle 10G EM Database Console
  3. bzoj 1827: [Usaco2010 Mar]gather 奶牛大集会【树形dp】
  4. 【软考-软件设计师】计算机存储器的分类
  5. VirtualBox中出现UUID have already exists 解决方法
  6. mysql确认半同步命令_怎么判断mysql是否是半同步复制
  7. 随机数的生成 java
  8. 远端WWW服务支持TRACE请求漏洞修复(linux)
  9. 个人项目1:随机生成30道整数四则运算题
  10. json apis and ajax,FreeCodeCamp - JSON APIs and Ajax
  11. 用python做文件处理_用Python实现文件处理
  12. html5 section article
  13. 区块如何防篡改_CFCA联盟链荣获“2020区块链技术与应用创新成果”奖
  14. 全国统计用区划代码和城乡划分代码-70w数据
  15. java png转svg工具_关于图像:将TIFF或PNG或JPEG转换为SVG的Java API
  16. 挑筋(挑治)疗法——针挑治疗痔疮
  17. 读研规划,准研究生们看看哦!!!!!!!!!!!!!
  18. 龙讯LT8911EXB高性能MIPI转EDP分辨率1080P概述
  19. 【智能零售】解读双11后的新零售趋势
  20. 8421码5421码2421码和余3码的区别

热门文章

  1. 低代码让人人都是开发者,高校人才有了努力的新方向
  2. 一步步实现一个城市选择器
  3. c语言程序小灯从右向左闪烁,单片机控制LED灯点亮(C语言).PPT
  4. proe输出stl文件
  5. Centos配置nginx代理上网
  6. M102: MongoDB for DBAs chapter 3 performance学习记录
  7. 深入理解CV中的Attention机制之SE模块
  8. DAC驱动芯片 GP8201 GP8403
  9. .Net项目分层与文件夹结构大全(最佳架子奖,吐槽奖,阴沟翻船奖揭晓)
  10. PKG_PROG_PKG_CONFIG: command not found 解决方法