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

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

设数组的长度为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

可知运行结果正确。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498401.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有史以来影响世界的颠覆性技术 | 未来的高附加值颠覆性技术产业

来源:DeepTech深科技(ID:mit-tr) 概要:没有工具,人类就是一个脆弱的物种,没有任何人种可以手无寸铁面对自然。技术伴随人类成长,从野蛮走向文明。人类历史就是一部技术史。 人类发展…

redirect java 配置_Java从后台重定向(redirect)到另一个项目的方法

(1)通过ModelAndView跳转RequestMapping("alipayforward")public ModelAndView alipayforward(HttpServletRequest req, HttpServletResponse resp) throwsException {String contNoreq.getParameter("contNo");logger.info("访问/downloadRequestEle…

一文详解脑科学研究与产业发展方向

来源:神经科技、脑计划 概要:大脑是人体最复杂的器官,破译大脑运转密码、揭开生命之谜,是令无数科学家殚精竭虑的艰难课题。脑科学已成为21世纪最前沿的研究领域,尤其与信息科学进行交叉研究已成为脑科学发展的一个重要…

ef生成mysql字段注释_EFcore+MySql 数据迁移的时候,怎么给表结构加注释?

前言:CodeFirst运用的场景比较少,不代表CodeFirst不好,也不能和DbFirst去作比较,本来就是两个东西。吐槽:MySql.Data.EntityFrameworkCore 作为Oracle官方维护的组件,居然对EF很多API不支持或者无效&#x…

10秒一部电影,全球首个5G数据连接完成

作者:李赓 概要:2017年10月17日、也就是上周二,高通在香港高调宣布——其面向移动终端的5G调制解调器芯片组,骁龙X50 5G调制解调器芯片组完成了全球首个5G连接,同时实现了千兆级速率并在28GHz毫米波频段上的数据连接。…

idea 不打开文件提示错误_解决IDEA误删out目录下的文件导致404无法访问的问题

前言有时候IDEA下写Web项目时可能会遇到如下问题:误删out目录下的文件导致开启服务器后无法访问页面的问题新增加一个页面或添加一张图片,在项目编译运行后,未能自动更新到out\artifacts\目录下,从而导致页面无法访问,或者图片未能…

华为生态链的全方位解读

来源: 本翼资本CapitalWings 概要:华为作为目前国内ICT行业的融合性创新龙头企业,其多年经营探索的经营模式和宝贵经验使得其成为传统制造业转型的标杆,而对于新兴企业,能够越过坎坷的探索之路,直接嫁接华…

java jvm对象_Java对象在JVM中长啥样

前言Java 是门面向对象的开发语言,那么我们自己编写的 Java 类生成的对象是什么样的?它肯定保存在虚拟机的内存中,但它以怎样的结构来保存的呢?带着疑问往下看看。关于KlassJava 层的开发可能不太熟悉 Klass,但肯定熟悉…

洪小文:以科学的方式赤裸裸地剖析人工智能

来源: 微软研究院AI头条 概要:要想在未来实现人工智能这项“新”技术的最大化利用,必须清楚认识到人工智能到底是什么,过去我们做了什么,今天能做什么,未来又能有什么新的发展可能。 近两年来,人…

java ee ide 添加spring,如何在Eclipse IDE项目文件夹中为spring添加jar文件

I am going to start MVC with Spring framework, but I am unable to get jar file of spring framework .I have tried in help menu>install new software>add new in Eclipse IDE but I failed. Can anyone please guide me ?解决方案You can try download STS (Spr…

人工智能如何驱动实体经济?六大领域展望

来源:腾讯研究院 概要:科技进步正在成为推进经济发展的重要推动力,对中国经济发展的贡献率已经上升到56.2%。面对正在兴起的人工智能浪潮,如何占据行业发展制高点,如何促进与实体经济深度融合,形成新增长点…

《浪潮之巅》作者吴军最新演讲:超级人工智能

来源:亿欧 概要:10月22日,AMINO硅谷中国“新”大会在南京经济技术开发区举行。《浪潮之巅》作者、AMINO资本合伙人吴军发表了以《超级人工智能》为主题的演讲。 人工智能起源 我知道很多人都想听我讲人工智能是怎么回事儿?最近有…

mysql慢sql增加读写分离_MySQL主从同步+读写分离

MySQL主从同步读写分离实验拓扑:三台mysql数据库:192.168.80.101 主服务器 mysql192.168.80.102 从1服务器 mysql192.168.80.103 从2服务器 mysql192.168.80.104 调度器Amoeba服务器 jdk、amoeba192.168.80.105 mysql客户端 mysql第一部分:三…

Google公布OpenFermion:量子计算机的开源软件包

来源:转载自公众号「雷克世界」微信号:ROBO_AI 作者:Ryan Babbush、Jarrod McClean 编译:嗯~阿童木呀、多啦A亮 概要:OpenFermion是一个用于模拟电子(费米子)相互作用系统的库,它能够…

java 类集合_java集合类详解

一、集合类与数组的区别1.集合的长度可变,数组的长度固定;2.集合用来存放对象引用,数组用来存放基本类型的数据;二、集合类的关系1.Collection接口存储一组不唯一、无序的对象。2.List接口存储一组不唯一、有序(插入顺序)的对象。…

英特尔宣布推出“Nervana”神经网络处理器

原作者:Ryan Whitwam 译者:彭婷 概要:Nervana NNP就是基于这种计算设计的。这也是所谓的专用集成电路(ASIC),所以它无法应用于一般的计算任务。 科幻小说家和现代科技大型公司一致认为AI可以开辟出一条康庄…

java爬取button_学习使用Java的webmagic框架爬取网页内容

(一)使用前的配置:2,(1)添加依赖:us.codecraftwebmagic-core0.7.3us.codecraftwebmagic-extension0.7.3us.codecraftwebmagic-selenium0.7.3(2)从GitHub官网下载webmagic的压缩包(https://codeload.github.com/code4craft/webmagic/zip/maste…

异构智能吴韧:物联网是“伪命题”?智联网才是未来

概要:“咨询机构预测,在未来人工智能的市场上12%的比例的资金将用在人工智能芯片上。”吴韧表示,异构智能瞄准的就是人工智能本地芯片市场。 Novumind异构智能(以下简称异构智能)在火热的人工智能新闻里出现的次数屈指…

java栈编程题_Java实现栈和队列面试题

面试的时候,栈和队列经常会成对出现来考察。本文包含栈和队列的如下考试内容:(1)栈的创建(2)队列的创建(3)两个栈实现一个队列(4)两个队列实现一个栈(5)设计含最小函数min()的栈,要求min、push、pop、的时间复杂度都是O(1)(6)判断栈的push和p…

联合国《2017年信息经济报告》

来源:联合国 概要:数字经济已经深入到了人们生活的衣食住行等所有方面,其发展速度和方式超出人们的想象。数字经济将把人类带往何方?这还是一个难解的谜题。 数字经济已经深入到了人们生活的衣食住行等所有方面,其发展…