经典冒泡排序及其优化

经典排序算法 - 冒泡排序Bubble sort

原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似,看例子。

例子为从小到大排序,为了便于观察,选取

原始待排序数组:| 6 | 2 | 4 | 1 | 5 | 9 |

第一趟排序(外循环)

第一次两两比较6 > 2交换(内循环)

交换前状态| 6 | 2 | 4 | 1 | 5 | 9 |

交换后状态| 2 | 6 | 4 | 1 | 5 | 9 |

 

第二次两两比较,6 > 4交换

交换前状态| 2 | 6 | 4 | 1 | 5 | 9 |

交换后状态| 2 | 4 | 6 | 1 | 5 | 9 |

 

第三次两两比较,6 > 1交换

交换前状态| 2 | 4 | 6 | 1 | 5 | 9 |

交换后状态| 2 | 4 | 1 | 6 | 5 | 9 |

 

第四次两两比较,6 > 5交换

交换前状态| 2 | 4 | 1 | 6 | 5 | 9 |

交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |

 

第五次两两比较,6 < 9不交换

交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |

交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |

 

第二趟排序(外循环)

第一次两两比较2 < 4不交换

交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |

交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |

 

第二次两两比较,4 > 1交换

交换前状态| 2 | 4 | 1 | 5 | 6 | 9 | 
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |

 

第三次两两比较,4 < 5不交换

交换前状态| 2 | 1 | 4 | 5 | 6 | 9 | 
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |

 

第四次两两比较,5 < 6不交换

交换前状态| 2 | 1 | 4 | 5 | 6 | 9 |

交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |

 

第三趟排序(外循环)

第一次两两比较2 > 1交换

交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |

交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |

 

第二次两两比较,2 < 4不交换

交换后状态| 1 | 2 | 4 | 5 | 6 | 9 | 
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |

 

第三次两两比较,4 < 5不交换

交换后状态| 1 | 2 | 4 | 5 | 6 | 9 | 
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |

 

第四趟排序(外循环)无交换

第五趟排序(外循环)无交换


排序完毕,输出最终结果1 2 4 5 6 9


下面是代码实现(仅供参考),为了更直观地表示优化结果,选取

原始待排序数组:|2|1|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|

public class BubbleSort2 {public int[] bubbleSort(int[] A, int n) {boolean flag = true;for (int i = 0; i < n && flag; i++) {flag = false;for (int j = i; j < n; j++) {if (A[i] > A[j]) {int temp = A[i];A[i] = A[j];A[j] = temp;flag = true;}}}return A;}public static void main(String args[]) {int A[] = { 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 };int n = A.length;BubbleSort bubbleSort = new BubbleSort();double start = System.currentTimeMillis();int B[] = bubbleSort.bubbleSort(A, n);for (int i = 0; i < n; i++)System.out.print(B[i] + ",");double end = System.currentTimeMillis();System.out.println("\n程序运行时间:" + (end - start) + "毫秒");}
}

输出:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,
程序运行时间:1.0毫秒

显然,这样的程序是有问题的。因为除了第一和第二个关键字需要交换外,别的都已经是正常顺序,,当 i=1 时,交换了2和1,此时序列已经有序,但是算法仍然不依不饶地将 i=2 到 i=29 比较一遍。尽管并没有交换数据,但是之后的大量比较还是大大多余了。


public class BubbleSort2 {public int[] bubbleSort(int[] A, int n) {boolean flag = true;// flag作为标记for (int i = 0; i < n && flag; i++) {// 当flag为true时退出循环flag = false;// 初始flag为falsefor (int j = i; j < n; j++) {if (A[i] > A[j]) {int temp = A[i];A[i] = A[j];A[j] = temp;flag = true;// 如果有数据交换,则flag为true}}}return A;}public static void main(String args[]) {int A[] = { 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 };int n = A.length;BubbleSort bubbleSort = new BubbleSort();double start = System.currentTimeMillis();int B[] = bubbleSort.bubbleSort(A, n);for (int i = 0; i < n; i++)System.out.print(B[i] + ",");double end = System.currentTimeMillis();System.out.println("\n程序运行时间:" + (end - start) + "毫秒");}
}


输出:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,
程序运行时间:0.0毫秒


由此可见,稍微加个flag,程序运行时间缩短了。

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

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

相关文章

expdp导出 schema_记录一则expdp任务异常处理案例

在XTTS迁移测试阶段&#xff0c;遇到执行几个expdp的导出任务&#xff0c;迟迟没有返回任何信息&#xff0c;对应日志无任何输出。环境&#xff1a;AIX 6.1 Oracle 10.2.0.4现象&#xff1a;在XTTS迁移测试阶段&#xff0c;遇到执行几个expdp的导出任务&#xff0c;迟迟没有返…

java开发工具软件排行榜

前言&#xff1a; 都说学历是敲门砖&#xff0c;是一点都没错&#xff0c;即使是在重技术轻学历的互联网企业&#xff0c;面试官对于学历越高的程序员初印象会更好&#xff0c;面试也会更顺利&#xff0c;而大部分专科学历的程序员&#xff0c;除非有过硬的技术&#xff0c;否…

简单选择排序算法

简单选择排序思想&#xff1a;首先&#xff0c;找到数组中最小的元素&#xff0c;其次&#xff0c;将它和数组第一个元素交换位置&#xff1b;再次&#xff0c;在剩下的元素中找到最小的元素&#xff0c;将它与数组中的第二个元素交换。如此亡故&#xff0c;直到将整个数组排序…

java开发工程师工作内容怎么写

什么是分布式锁&#xff1f;在回答这个问题之前&#xff0c;我们先回答一下什么是锁。 普通的锁&#xff0c;即在单机多线程环境下&#xff0c;当多个线程需要访问同一个变量或代码片段时&#xff0c;被访问的变量或代码片段叫做临界区域&#xff0c;我们需要控制线程一个一个…

community 计算模块度_光模块深度:国内光模块企业快速崛起

一、核心观点二、发展追溯:技术是底蕴、创新是动力1 光通信发展:技术迭代加快&#xff0c;国产替代是前进的方向依据摩尔定律&#xff0c;光模块的小型化、低成本以及高速率是产品迭代的主要方向。2 竞争格局:市场集中度高&#xff0c;巨头地位稳固&#xff0c;国内厂商稳步崛起…

java开发工程师的自我评价

前言 京东到家订单中心系统业务中&#xff0c;无论是外部商家的订单生产&#xff0c;或是内部上下游系统的依赖&#xff0c;订单查询的调用量都非常大&#xff0c;造成了订单数据读多写少的情况。 我们把订单数据存储在MySQL中&#xff0c;但显然只通过DB来支撑大量的查询是不…

华为魔术手机拆机图解_华为P9进水不显示维修案例

看点&#xff1a;iPhone X原装屏与国产屏有哪些区别&#xff1f;看点&#xff1a;换7P、8P屏幕&#xff1a;C11和DTP和DKH的区别狮淘&#xff1a;华人手机维修师专属工具集合店&#xff0c;不锈钢拆机片5个只需9.9元&#xff01;包邮山猫潮品&#xff1a;手机渠道直供&#xff…

java开发工程师自我介绍文本

前言 每年金三银四&#xff0c;金九银十之际&#xff0c;想进阶梦想挑战大厂的朋友层出不穷。 梦想是要有的&#xff0c;万一就实现了呢&#xff1f;且撇开大牛们不说&#xff0c;每年面试之时问题也层出不穷&#xff0c;不得不说&#xff0c;每年被算法绝杀的朋友也是不在少数…

面向对象技术

面向对象和面向过程的区别 出发点不同。 面向对象强调问题域的要领直接映射到对象和对象之间的接口上&#xff0c;是用符合常规思维的方式来处理客观世界的问题。 面向过程方法强调的则是过程的抽象化和模块化&#xff0c;是以过程为中心构造或处理客观世界问题的。层次逻辑…

ad09只在一定范围内查找相似对象_23、面向对象编程

目录&#xff1a;对象的概念类与对象面向对象编程类的定义与实例化属性访问类属性与对象属性属性查找顺序与绑定方法小结视频链接一 对象的概念”面向对象“的核心是“对象”二字&#xff0c;而对象的精髓在于“整合“&#xff0c;什么意思&#xff1f;所有的程序都是由”数据”…

java开发工程师转行可以做什么

前言 分布式事务主要解决分布式一致性的问题。说到底就是数据的分布式操作导致仅依靠本地事务无法保证原子性。与单机版的事务不同的是&#xff0c;单机是把多个命令打包成一个统一处理&#xff0c;分布式事务是将多个机器上执行的命令打包成一个命令统一处理。 MySQL 提供了…

atlas怎么看日志_亿级的日志治理!微服务最佳方案,ELK stack从零搭建

ELK Stack 诞生背景一般我们需要进行日志分析场景&#xff1a;直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大的场景中&#xff0c;此方法效率低下&#xff0c;面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化的日志管理…

Java变量类型

所有的变量在使用前必须声明。 type identifier [ value][, identifier [ value] ...] ; 格式说明&#xff1a;type是数据类型&#xff0c;identifier是变量名&#xff0c;可以使用逗号隔开来声明多个同类型变量。 一下列出一些变量的声明实例&#xff0c;有些包含了初始化过…

java开发工程师面试问题大全及答案大全

前言 Alibaba作为国内互联网行业的“老大”&#xff0c;一直以来也是很多“数码宝贝”梦寐以求的公司&#xff0c;我个人是做Java开发的&#xff0c;阿里这些年也开发了很多屌炸天的开源项目&#xff0c;像什么Spring Cloud Alibaba&#xff0c;开源Java诊断工具Arthas&#x…

me shy是什么歌 抖音make_内含活动福利 | 小红书、抖音爆赞的高颜值的北欧家居神店开到卜蜂中心啦!...

几个月前&#xff0c;一家北欧范颜值爆表的瑞典独立设计师品牌家居店凭借其充满设计感的产品刷爆社交媒体微博、小红书、抖音经常出现它的身影随便一篇阅读量、收藏量都好几万数不清的爆like让人按耐不住了&#xff01;这个品牌叫NǑME家居(认住这个正版的Ǒ)&#xff0c;开到哪…

java开发工程师面试题及答案

前言 作为一名编程人员&#xff0c;对MySQL一定不会陌生&#xff0c;尤其是互联网行业&#xff0c;对MySQL的使用是比较多的。对于求职者来说&#xff0c;MySQL又是面试中一定会问到的重点&#xff0c;很多人拥有大厂梦&#xff0c;却因为MySQL败下阵来。实际上&#xff0c;My…

吕玉琴考研指导电子版_【干货大放送】中国历代文学作品选阅读指导PDF

跟紧我&#xff0c;来年轻松收获录取通知书~长按一战成硕hello&#xff0c;我是小致带你考研上路今天给大家分享的干货内容是《历代文学作品选》阅读指导之前1000题浓缩资料&#xff0c;后台回复【浓缩】获取不要再留邮箱了&#xff0c;直接后台获取本次资料由致远文学考研原创…

java开发工程师面试题总结

一、背景 我们日常在电商网站购物时经常会遇到一些高并发的场景&#xff0c;例如电商 App 上经常出现的秒杀活动、限量优惠券抢购&#xff0c;还有我们去哪儿网的火车票抢票系统等&#xff0c;这些场景有一个共同特点就是访问量激增&#xff0c;虽然在系统设计时会通过限流、异…

Java重写和重载

重写&#xff08;Override&#xff09; 重写是子类重写父类的方法&#xff0c;如果重写了父类的方法&#xff0c;访问时父类的方法就会被覆盖&#xff0c;如果想要再访问父类的同名方法&#xff0c;要用super关键字。重写的好处在于子类可以根据自己的需要&#xff0c;定义特定…

7天拿到阿里Android岗位offer,都是精髓!

食用指南 和大部分人一样&#xff0c;我在复习完第一遍Android知识的情况下&#xff0c;看到相关的知识回答的仍然不能够令自己满意。 在第二遍系统复习的时候&#xff0c;我着重记住每个知识点的关键字&#xff0c;根据这些关键字拼凑出大概的知识点&#xff0c;最后看到每个…