冒泡排序是非常好理解的,以从小到大排序为例,每一轮排序就找出未排序序列中最大值放在最后。

设数组的长度为N:

(1)比较前后相邻的二个数据,如果前面数据大于后面的数据,就将这二个数据交换。

(2)这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。

(3)N=N-1,如果N不为0就重复前面二步,否则排序完成。

以上就是冒泡排序的基本思想,按照这个定义很快就能写出代码:

/**

* 冒泡排序的第一种实现, 没有任何优化

*@param a

*@param n

*/

public static void bubbleSort1(int [] a, int n){

int i, j;

for(i=0; i

for(j=1; j

if(a[j-1] > a[j]){//前面的数字大于后面的数字就交换

//交换a[j-1]和a[j]

int temp;

temp = a[j-1];

a[j-1] = a[j];

a[j]=temp;

}

}

}

}// end

给出一个测试代码:

public static void main(String[] args) {

int[] arr = {1,1,2,0,9,3,12,7,8,3,4,65,22};

BubbleSort.bubbleSort1(arr, arr.length);

for(int i:arr){

System.out.print(i+",");

}

}

运行结果:

0,1,1,2,3,3,4,7,8,9,12,22,65,

下面开始考虑优化,如果对于一个本身有序的序列,或则序列后面一大部分都是有序的序列,上面的算法就会浪费很多的时间开销,这里设置一个标志flag,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。

/**

* 设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。

*@param a

*@param n

*/

public static void bubbleSort2(int [] a, int n){

int j, k = n;

boolean flag = true;//发生了交换就为true, 没发生就为false,第一次判断时必须标志位true。

while (flag){

flag=false;//每次开始排序前,都设置flag为未排序过

for(j=1; j

if(a[j-1] > a[j]){//前面的数字大于后面的数字就交换

//交换a[j-1]和a[j]

int temp;

temp = a[j-1];

a[j-1] = a[j];

a[j]=temp;

//表示交换过数据;

flag = true;

}

}

k--;//减小一次排序的尾边界

}//end while

}//end

运行测试main函数结果:

0,1,1,2,3,3,4,7,8,9,12,22,65,

再进一步做优化。比如,现在有一个包含1000个数的数组,仅前面100个无序,后面900个都已排好序且都大于前面100个数字,那么在第一趟遍历后,最后发生交换的位置必定小于100,且这个位置之后的数据必定已经有序了,也就是这个位置以后的数据不需要再排序了,于是记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。如果是对于上面的冒泡排序算法2来说,虽然也只排序100次,但是前面的100次排序每次都要对后面的900个数据进行比较,而对于现在的排序算法3,只需要有一次比较后面的900个数据,之后就会设置尾边界,保证后面的900个数据不再被排序。

public static void bubbleSort3(int [] a, int n){

int j , k;

int flag = n ;//flag来记录最后交换的位置,也就是排序的尾边界

while (flag > 0){//排序未结束标志

k = flag; //k 来记录遍历的尾边界

flag = 0;

for(j=1; j

if(a[j-1] > a[j]){//前面的数字大于后面的数字就交换

//交换a[j-1]和a[j]

int temp;

temp = a[j-1];

a[j-1] = a[j];

a[j]=temp;

//表示交换过数据;

flag = j;//记录最新的尾边界.

}

}

}

}

这种方法是我看到的最优化的冒泡排序了。

运行测试例子结果:

0,1,1,2,3,3,4,7,8,9,12,22,65,

1

可知运行结果正确。

java 冒泡排序的三种写法_冒泡排序的三种实现(Java)相关推荐

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

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

  2. matlab 高斯模糊_摸鱼 | 茴香豆的“茴”有四种写法,模糊有几种糊法?

    时隔十二天终于等到宋老师的回复后,我拿到了自己的憨憨照片. (后知后觉的宋老师) 刚好考完认知期中(然后三周过去了),便摸个鱼,研究一下Photoshop的使用.今天就整理一下有关模糊的方法. 模糊的 ...

  3. java多线程写在哪一层_面试知识点三:Java多线程

    35.并行和并发有什么区别? 36.线程和进程的区别? 37.守护线程是什么? 38.创建线程有哪几种方式? 39.说一下 runnable 和 callable 有什么区别? 40.线程有哪些状态? ...

  4. java三目表达式_史上最强《Java 开发手册》泰山版王者归来

    简介:潜力修炼一年之久的<Java 开发手册(泰山版)>今天发布!此次共计新增 34 条规约,修改描述 90 处,其中错误码规则更是第一次提出完整的解决方案,大家参考错误码示例表,欢迎大家 ...

  5. python的for语句是否只有一种写法_跟老齐学Python之for循环语句

    废话少说,上干活. for的基本操作 for是用来循环的,是从某个对象那里依次将元素读取出来.看下面的例子,将已经学习过的数据对象用for循环一下,看看哪些能够使用,哪些不能使用.同时也是复习一下过往 ...

  6. 于的繁体字有几种写法_于字的意思、于的繁体字、于的笔顺笔画、于字部首和繁体字于的意思...

    于的拼音yú.笔顺.部首二.笔画3有关中文"于"的繁体字怎么写,和简体字于笔划结构 于的意思分解: 学会于的繁体字,先看于字的演变.笔画(笔划).笔顺.部首.拼音.有关带有繁体字( ...

  7. java代码优化的方法和准则_编写高质量代码:改善Java程序的151个建议(第1章:JAVA开发中通用的方法和准则___建议16~20)...

    建议16:易变业务使用脚本语言编写 Java世界一直在遭受着异种语言的入侵,比如PHP,Ruby,Groovy.Javascript等,这些入侵者都有一个共同特征:全是同一类语言-----脚本语言,它 ...

  8. 用java定义中国象棋的棋子_中国象棋棋子定义代码java

    棋盘和棋子 象棋是棋子共三十二个,分为红黑两组,各十六个,由对弈双方各执一组,兵种是一样的,分为七种: 红方:帅.仕.相.车.马.炮.兵 黑方:将.士.象.车.马.炮.卒 其中帅与将.仕与士.相与象. ...

  9. java内存 phd文件抓取_您可以从IBM PHD Java堆转储中提取字符串的值吗?

    我有一个来自IBM jvm的PHD格式堆转储,我希望检查一些字符串的值.使用Sun JVM的二进制hprof转储,这是可能的,但是我无法从IBM转储中恢复此信息. 我试过了: >具有IBM DT ...

最新文章

  1. 【转】memcached工作原理介绍
  2. linux yum nginx 安装,Linux下 yum 安装 nginx 以及运维
  3. 微软.Net开发中的多线程编程总结
  4. 多行单列CV小技能----Alt加鼠标滚轮
  5. 图解TCPIP-MAC地址(数据链路层)
  6. 用友U8自定义按钮开发
  7. Linux多线程编程-线程间参数传递
  8. popWindow回传方法
  9. springboot工作流程
  10. url在html中的作用,所谓的URL到底是什么意思,URL有什么作用
  11. 蓝牙模块定位_详解蓝牙4.0BLEbeacon室内定位原理
  12. 使用diskpart制作U盘启动盘
  13. (360校招笔试题)病毒:判断由0或1组成数字的数量
  14. 解决QQ 群共享无法打开,页面无法显示
  15. 学习淘淘商城第三十四课(在业务逻辑中添加缓存)
  16. 互联网时代,你我皆楚门
  17. windows 查看开机关机日志
  18. 菜鸟窝BAT企业安卓学习笔记
  19. MySQL Server 安装和卸载
  20. MacBook随笔之快捷键二(访达和系统快捷键)

热门文章

  1. logging.getLogger(logger)
  2. 战斗机嵌入式训练系统中的智能虚拟陪练
  3. 第一个关于中式菜谱的智能问答机器人小程序正式上线啦
  4. php类中双冒号和-的区别
  5. javascript数组扁平化处理
  6. 老李分享:基于图像识别的跨平台的手机自动化测试方案
  7. BZOJ 1606: [Usaco2008 Dec]Hay For Sale 购买干草
  8. 计算机网络——链路层之停止等待协议
  9. linux的基础知识——信号的概念
  10. Unity3D-声音系统