java与算法_Java与算法之(1) - 冒泡排序

冒泡排序法的原理是,每次比较相邻的两个元素,如果它们的顺序错误就把它们交换过来。

例如对4 3 6 2 7 1 5这7个数字进行从小到大的排序,从最左侧开始,首先比较4和3

c8efcb4bc1e59ff66e086e317ef25eed.png

因为是从小到大排序,4和3的顺序显然是错误的,交换他们,得到

8fb28926234b58a2b51ca89d6e223384.png

接下来比较4和6

58f4a3541edfa9ad5349128ef65fb63e.png

顺序是正确的,不需要任何操作。接下来进行下一步,比较6和2

70964b36c5b4a29d445ab90c7a57112a.png

6显然应该排在2的后面,怎么办?交换它们,得到

3dd80fa410ec670d0f0a1c6db3a07d1c.png

经过前面几步,已经可以总结出规律,那么接下来要做的比较依次是:

7 > 1? 得到 3 4 2 6 1 7 5

7 > 5? 得到

7d8e09cff75a75dab019592400c532ed.png

到此,7的右边已经没有数可以比较,第一轮排队结束。经过这一轮,已经成功的把最大的数,即7放在了最后。但是前面6个数的顺序还是不对,但是按照上面的思路很容易想到,对前面6个数再来一遍,即可把6放到倒数第二的位置。然后再对前面5个数重复逐个比较的步骤。。。

7个数字需要进行7-1=6次排队,每完成一轮排队,下一轮排队需要比较的数字个数减1,来看代码

public class BubbleSort {

public void sort(int... numbers) {

//n个数执行n-1轮

//每一轮后完成一个数字归位, 下一轮要比较的数字个数减1(所以内层循环是j 

int n = numbers.length - 1;

int t;

for(int i = 0; i 

for(int j = 0; j 

if(numbers[j] > numbers[j + 1]) {

t = numbers[j];

numbers[j] = numbers[j + 1];

numbers[j + 1] = t;

}

}

}

}

}

测试

public static void main(String[] args) {

int[] numbers = new int[]{ 4, 3, 6, 2, 7, 1, 5 };

System.out.print("before: ");

for(int i = 0; i 

System.out.print(numbers[i] + "  ");

}

System.out.println();

new BubbleSort().sort(numbers);

System.out.print("after: ");

for(int i = 0; i 

System.out.print(numbers[i] + "  ");

}

System.out.println();

}

输出

before: 4  3  6  2  7  1  5

after: 1  2  3  4  5  6  7

冒泡排序的核心是两层嵌套的循环,时间复杂度是O(N^2),即对N个数排序,需要近似执行N的平方次。因为效率较低,实际开发中基本不会使用,但是因为简单易懂通常做为学习算法的入门案例。

如果用上面的代码对1 2 3 4 5 6 7做从小到大排列,会发现虽然数字已经排列好,但是程序还是要忠实的执行完全部两层循环。对这种情况,我们可以引入一个变量来记录一次内层循环中交换数字的个数,如果交换个数为0,则提前终止循环,在某些情况下可以提高效率。

public void betterSort(boolean descend, int... numbers) {

System.out.print("before: ");

for(int i = 0; i 

System.out.print(numbers[i] + "  ");

}

System.out.println();

//n个数执行n-1轮

//每一轮后完成一个数字归位, 下一轮要比较的数字个数减1(所以内层循环是j 

int n = numbers.length - 1;

int t;

int flag = 0;

for(int i = 0; i 

for(int j = 0; j 

if(descend) { //从大到小

if(numbers[j] 

t = numbers[j];

numbers[j] = numbers[j + 1];

numbers[j + 1] = t;

flag = 1;

}

} else {

if(numbers[j] > numbers[j + 1]) {

t = numbers[j];

numbers[j] = numbers[j + 1];

numbers[j + 1] = t;

flag = 1;

}

}

}

if(flag == 0) {

break;

} else {

flag = 0;

}

}

System.out.print("after: ");

for(int i = 0; i 

System.out.print(numbers[i] + "  ");

}

System.out.println();

}

增加一个变量需要额外占用内存空间,因此,这个方法是以空间换时间。

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

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

相关文章

JQuery链式操作简单的菜单列表

看到这个简单的菜单demo,也是为了再看看JQuery对DOM的操作,一直都记不牢,特别是siblings()这个总是想不起来。 这次再过一遍JQuery,不管简单的还是复杂的demo 还是坚持练习一遍吧!只为记录&…

利用JS实现点击上一周或下一周却换

1.页面加载显示当前年份的第几周 效果如图&#xff1a; html代码&#xff1a; <font size"2" color"black"> <input id"btnweek5" type"button" class"btn" value"上周" οnclick"EduCommissio…

java reference 传引用_Java的引用(reference)---Roni

摘自《Java面向对象编程》一书,作者:孙卫琴 来源:www.javathinker.org在JDK1.2以前的版本中&#xff0c;当一个对象不被任何变量引用&#xff0c;那么程序就无法再使用这个对象。也就是说&#xff0c;只有对象处于可触及状态&#xff0c;程序才能使用它。这就像在日常生活中&am…

C# 以管理员身份运行程序

刚看了一篇博友写的“以管理员身份运行程序”, 所以我也来写一个简单易懂的&#xff0c;简单两步搞定&#xff0c;不用写任何代码&#xff1a; 第一步&#xff1a; 右键选择项目 > 添加 > 新建项 &#xff1b; 找到 应用程序清单文件&#xff0c;后缀名为manifest&#x…

会计转行从事IT,如何在一年时间内全职学习?

2019独角兽企业重金招聘Python工程师标准>>> https://www.zhihu.com/question/21427478/answer/18227060 转载于:https://my.oschina.net/soho00147/blog/836138

如何生成后缀表达式

如果计算一个表达式&#xff0c;比如 456*2&#xff0c;随着计算器的不同&#xff0c;简单的四功能计算器是30&#xff0c;许多科学计算器知道乘法的优先级高于加法&#xff0c;所以科学答案是21。典型计算顺序可以是计算45&#xff0c;存为临时变量a&#xff0c;再计算6*2&…

【原生JS插件】LoadingBar页面顶部加载进度条

先展示一下已经实现的效果&#xff1a; 预览地址&#xff1a;http://dtdxrk.github.io/js-plug/LoadingBar/index.html 看到手机上的浏览器内置了页面的加载进度条&#xff0c;想用在pc上。 网上搜了一下&#xff0c;看到几种页面loading的方法&#xff1a; 1.在body头部加入lo…

qtp启动java程序_转: QTP六脉神剑之调用Java程序

查看( 1147 ) /评论( 21 )六脉神剑之调用程序0Xp1zLN_0版权声明&#xff1a;原创作品&#xff0c;转载请以链接方式注明出自http://www.51testing.com/?35&#xff0c;否则将追究法律责任。51Testing软件测试网y|X,taS51Testing软件测试网b;|w6I"g6oK本文出自songfun的51…

第八章 Python 对象和类

一、什么是对象 在 Pyth 中&#xff0c;对象就是经过实例化的&#xff0c;具体可以操作的一组代码的组合&#xff1b; 对象一般包含数据&#xff08;变量&#xff0c;更习惯称之为属性 attribute&#xff09;&#xff0c;也包含代码&#xff08;函数&#xff0c;也称之为方法&a…

Spring WebSocket初探2 (Spring WebSocket入门教程)

2019独角兽企业重金招聘Python工程师标准>>> WebSocket前端准备 SockJS&#xff1a; SockJS 是一个浏览器上运行的 JavaScript 库&#xff0c;如果浏览器不支持 WebSocket&#xff0c;该库可以模拟对 WebSocket 的支持&#xff0c;实现浏览器和 Web 服务器之间低延迟…

String类的使用 Part2

StringBuilder 类的使用 属性&#xff1a; namespace StringBuilderTest {class Program{static void Main(string[] args){StringBuilder s new StringBuilder("hello,world!");Console.WriteLine(s);//Length属性Console.WriteLine("s.Length{0}", s.Le…

JAVA项目怎么不是蓝色_解决IDEA创建maven项目时pom.xml没有变蓝的问题

如下所示&#xff1a;选中pom.xml&#xff0c;右键点击add as maven project&#xff0c;稍等片刻后就可以了补充知识&#xff1a;Idea导入maven项目不自动识别pom.xml*Idea导入maven项目不自动识别pom.xml*当在idea中导入maven项目时&#xff0c;不能自动识别pom文件解决方法&…

C# 6.0:Expression – Bodied Methods

Expression-bodied 方法是C# 6.0 中另一个能简化代码的特性。我们已经对lambda表达式将funciton和delegation关联起来的这种用法很熟悉了。Expression-bodied 将lambda 表达式的这种用法扩展到了方法上。 像下面代码所示&#xff0c;我们有一个GetTime() 方法返回一个格式化的时…

POJ 1228 Grandpa's Estate --深入理解凸包

题意&#xff1a; 判断凸包是否稳定。 解法&#xff1a; 稳定凸包每条边上至少有三个点。 这题就在于求凸包的细节了&#xff0c;求凸包有两种算法&#xff1a; 1.基于水平序的Andrew算法 2.基于极角序的Graham算法 两种算法都有一个类似下面的语句&#xff1a; for(int i0;i&…

赵强老师免费公开课第一季:Hadoop的背景起源

标签&#xff1a;免费直播课 Hadoop 大数据 赵强原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://51edu.blog.51cto.com/8899635/1897555 Hadoop大数据免费公开课招募啦~~~赵强…

.NET Windows服务应用程序

此文旨在记录个人对windows服务的理解以及学习记录&#xff0c;高人可以直接绕行。 1.Windows 服务体系结构 http://technet.microsoft.com/zh-cn/library/aa998749(vexchg.65).aspx Windows 服务&#xff08;也称服务应用程序&#xff09;是无论用户是否登录都运行在 Windows …

bootstrap-代码-内联代码

说明通过 <code> 标签包裹内联样式的代码片段示例<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"view…

java类似php魔术方法_PHP与类有关的几个魔术方法

与类有关的其他魔术方法序列化与反序列化技术含义&#xff1a;序列化&#xff1a;就是将一个变量所代表的“内存”数据&#xff0c;转换为“字符串”形式并持久保存在硬盘上的一种做法。反序列化&#xff1a;就是将序列化之后保存在硬盘上的“字符串数据”&#xff0c;恢复为其…

IIS ARR设置HTTP跳转到HTTPS

GUI Version - Select the website you wish to configure- In the “Features View” panel, double click URL Rewrite You will notice there are currently no rules configured for this site. Click “Add Rules…” in the Actions menu to the right of the “Features…

AutoCAD.NET API 最新(2012)教程下载及在线视频教程DevTV

Autodek最近发布了基于最新版的AutoCAD 2012的.net API开发教程。基本内容包括&#xff1a; Overview of .NETPlugin BasicsUser InteractionDatabase fundamentalsDictionariesUser InterfaceEventsInputPoint MonitorJigs现在就可以从AutoCAD开发者中心下载&#xff0c; 看图…