java冒泡排序概练_Java的冒泡排序[通俗易懂]

java冒泡排序概练_Java的冒泡排序[通俗易懂]Java的冒泡排序一、冒泡排序基本概念冒泡排序,顾名思义,像冒泡一样的排序。对于一组数字,如{1、4、3、7、5、8、6}这一组数字,使用冒泡排序的话应该是按照以下步骤:第一趟:从第一个数开始,与相邻的数进行比较,然后把大数放在后面,小数放在前面,即先比较第一个数和第二个数,把大数放在后面,小数放在前面,再比较第二个数和第三个数,把大数放在后面,小数放在前面,再比较第三个数和第四个数,把大数放在后…

大家好,又见面了,我是你们的朋友全栈君。

Java的冒泡排序

一、冒泡排序基本概念

冒泡排序,顾名思义,像冒泡一样的排序。

对于一组数字,如{1、4、3、7、5、8、6}这一组数字,使用冒泡排序的话应该是按照以下步骤:

第一趟:

从第一个数开始,与相邻的数进行比较,然后把大数放在后面,小数放在前面,即先比较第一个数和第二个数,把大数放在后面,小数放在前面,再比较第二个数和第三个数,把大数放在后面,小数放在前面,再比较第三个数和第四个数,把大数放在后面,小数放在前面,以此类推,直到比较完最后一个数。因为每一次的比较都会把大数放在后面,所有当第一次循环比较完毕之后,最后一个数字就是这一组数字中最大的一个数。

如{1、4、3、7、5、8、6}这一组数字,首先比较1和4,因为4>1,所以4在1后面,然后比较4和3,同理4会在3后面,以此类推,第一次循环完毕之后的顺序是{1、3、4、5、7、6、8},此时最后一位数8就是最大的数字。

第二趟:

任然从第一个数开始开始比较,(当然,可能因为第一次循环比较时会导致现在的第一个数字不是一开始的数字),直到比较到倒数第二位数(因为第一次循环中已经找到最大的数并且放到了最后,所以第二次循环时无需比较),第二次循环完毕之后就会找到整组数字中倒数第二大的数,而且会放到倒数第二位。

第三趟:

……………..

依次类推,重复上述步骤,直到最终排序完成。

因为是从第一个数开始和相邻的数进行比较,所有就需要循环n-1次,即比较n-1趟,又因为每一趟都会找到最大的一个数放在后面,所以每一趟的比较都会比上一趟少比较一次,即n-1次、n-2次、n-3次…..1次。

(n是需要排序数字的个数)

二、java代码实现的基本思路

利用二重for循环实现,外重循环设为i(每一趟),内重循环设为j(每一趟的每一次比较),假设有n个数字需要排序,设int[] num=new int[n],则外循环重复n-1次,内循环重复n-1次、n-2次、n-3次…….1次,所以i的值依次为1、2…..n-1,对应的j的值为n-1、n-2、n-3…….1。因为比较的元素都是再内循环中进行比较,所以使用num[j]和num[j+1]表示比较的元素。

三、java代码实现

package bubble;

import java.util.Arrays;

public class Demo_01 {

public static void main(String[] args) {

//定义数组,存储要排序的数

int[] num = new int[]{2,1, 7, 8, 5, 6};

int[] result = star(num);

//输出数组

System.out.println(Arrays.toString(result));

}

public static int[] star(int[] num) {

//临时变量,用于交换数据

int temp;

//外重循环,即每一趟,需要循环n-1次,即比较n-1趟

for (int i = 0; i < num.length – 1; i++) {

//内重循环,即每一趟的每一次比较,每次比较n-1次、n-2次、n-3次…….1次

for (int j = 0; j < num.length – 1 – i; j++) {

//如果符合条件就交换数据

if (num[j + 1] < num[j]) {

temp = num[j];

num[j] = num[j + 1];

num[j + 1] = temp;

}

}

}

//返回排序好的数组

return num;

}

}

四、算法优化

在上面的代码中可以发现,程序只能按照我们的思路去运行,而在排序完成时程序并不能识别,当在需要排序的数字非常多的时候,程序就会显得比较笨拙。那么,我们应该在排序完成时结束排序,从而降低时间复杂度,我们可以在外重循环里设立一个布尔值flag,使得每一次排序开始前flag=true,如果在内重循环内发生了数据交换,则使flag=false。在新一轮排序开始前检查flag的值,如果flag=true,就说明上一次没有数据交换,那么就结束排序,否则就再开始下一轮排序。

五、优化后的java代码实现

package bubble;

import java.util.Arrays;

public class Demo_01 {

public static void main(String[] args) {

//定义数组,存储要排序的数

int[] num = new int[]{2,1, 7, 8, 5, 6};

int[] result = star(num);

//输出数组

System.out.println(Arrays.toString(result));

}

public static int[] star(int[] num) {

//临时变量,用于交换数据

int temp;

//外重循环,即每一趟,需要循环n-1次,即比较n-1趟

for (int i = 0; i < num.length – 1; i++) {

boolean flag=true ; //设置标志

//内重循环,即每一趟的每一次比较,每次比较n-1次、n-2次、n-3次…….1次

for (int j = 0; j < num.length – 1 – i; j++) {

//如果符合条件就交换数据

if (num[j + 1] < num[j]) {

temp = num[j];

num[j] = num[j + 1];

num[j + 1] = temp;

flag = false;//如果发生了数据交换,将标记flag

}

}

if (flag){

break;//如果发生了数据交换,将结束排序

}

}

//返回排序好的数组

return num;

}

}

六、结语

本文是本人在学习过程中的笔记分享,欢迎大家指正批评,同时也希望能够帮助到需要的人!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/157177.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • webstorm插件安装-代码缩略图插件「建议收藏」

    webstorm插件安装-代码缩略图插件「建议收藏」webstorm本身足够强大了,但是有时候也希望能有其他的附加功能。好在官方提供了足够多的插件。https://plugins.jetbrains.com/webstorm找一个自己喜欢的插件,以代码缩略图插件为例:https://plugins.jetbrains.com/plugin/7275-codeglance代码缩略图可以很直观的看到代码的情况,快速定位代码到对应位置…

  • 基于经纬度做航线图可视化的软件_碧蓝航线是哪家公司做的

    基于经纬度做航线图可视化的软件_碧蓝航线是哪家公司做的基于经纬度画航线图介绍代码介绍这阵子在处理航空公司的数据,为了PPT展示好看,做了几个可视化图。这里用的是pyecharts第三方库。pyecharts库的相关介绍,可以上设计文档看看相关说明。https://pyecharts.org/#/zh-cn/series_options代码importpandasaspddata=pd.read_csv(“airline_info.csv”,encoding=’gbk’)print(data)#数据太多,画出来太密了,这里选了

  • SpringBoot 使用 @Transactional 注解配置事务[通俗易懂]

    SpringBoot项目中需要配置事务管理,所以在这里系统地整理下关于@Transactional注解相关的知识!1、详细介绍事务管理是应用系统开发中必不可少的一部分。Spring为事务管理提供了丰富的功能支持。Spring事务管理分为编程式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代…

  • 26.学习Camera之——PDAF(相位对焦)的基本原理

    26.学习Camera之——PDAF(相位对焦)的基本原理在自动对焦的时候总是有一个困惑,知道图像是不清楚的,但是lens应该向前还是向后移动呢?总是要前后移动lens一下才知道,普通的反差法对焦就是这么做的,爬山嘛。PDAF的出现就是为了解决这个lens移动的问题,可以根据图像,预判lens运动的方向。PDAF最早运用在单反上,已经是非常成熟的技术了,原理如下图。左图为CCD在焦后的情况,右图为焦前。当CCD在焦后时,在线阵CCD1和CCD2上会发现聚焦点CCD1的在左,反之,则聚焦点CCD2的在左(图中红色标记的光线)。这种方法需要加.

  • js获取iframe中的内容(iframe内嵌页面)

    js如何获取包含自己iframe属性a.html如何在b.html里获取包含他的iframe的id在父页面中定义函数,再到子页面中调用。父页面parent.htmlfunctiongetFrameId(f){varframes=document.getElementsByTagName(“iframe”);//获取父页面所有iframefor(i=0;ijs怎样获取ifra…

  • LeetCode: Distinct Subsequences [115]

    LeetCode: Distinct Subsequences [115]

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号