新手小白学JAVA 冒泡排序

新手小白学JAVA 冒泡排序3冒泡排序bubble3.1概念冒泡排序(BubbleSort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。3.2形式相邻比较,从小到大

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

冒泡排序

1 概念

冒泡排序(Bubble Sort),是计算机科学领域中较简单的一种排序算法。
它重复地走访需要进行排序的元素,依次比较两个相邻的元素,如果元素的顺序(如从大到小、首字母从A到Z)错误就把元素的位置互换。
走访元素是重复进行的,直到没有任何相邻位置上的元素需要交换位置,排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。
光看理论可能会有些迷糊,没有关系,接下来我们详细学习一下冒泡排序究竟是如何比较,又是如何排序的~

2 排序思路

先给大家放几张图,让大家感受下冒泡排序是怎么排序的:
比如我现在有一组乱序的数据:
11 9 13 6 8 5,希望通过冒泡排序后得到从小到大按顺序排列的数据
首先开始第1轮的第1次比较:11与9进行比较,11>9,所以互换位置:
在这里插入图片描述

这是11与9互换位置后的结果,红线标注的就是当前正在比较的两个数据:
在这里插入图片描述
第1轮的第2次比较:11与13进行比较,11<13,符合顺序,无需互换位置:
在这里插入图片描述
第1轮的第3次比较:6与13进行比较,13>6,不符合顺序,这是互换位置后的结果:
在这里插入图片描述
第1轮的第4次比较:8与13进行比较,13>8,不符合顺序,这是互换位置后的结果:
在这里插入图片描述
第1轮的第5次比较:5与13进行比较,13>5,不符合顺序,这是互换位置后的结果:
目前第一轮所有元素都参与了比较,结果:9 11 6 8 5 13
在这里插入图片描述第2轮的第1次比较:9与11进行比较,9<11,符合顺序,无需互换位置:在这里插入图片描述
第2轮的第2次比较:11与6进行比较,11>6,不符合顺序,这是互换位置后的结果:
在这里插入图片描述
第2轮的第3次比较:11与8进行比较,11>8,不符合顺序,这是互换位置后的结果:
在这里插入图片描述
第2轮的第4次比较:11与5进行比较,11>5,不符合顺序,这是互换位置后的结果:
第二轮结果:9 6 8 5 11 13
在这里插入图片描述第3轮的第1次比较:9与6进行比较,9>6,不符合顺序,这是互换位置后的结果:在这里插入图片描述
第3轮的第2次比较:9与8进行比较,9>8,不符合顺序,这是互换位置后的结果:
在这里插入图片描述
第3轮的第3次比较:9与5进行比较,9>5,不符合顺序,这是互换位置后的结果:
第三轮结果:6 8 5 9 11 13
在这里插入图片描述
第4轮的第1次比较:6与8进行比较,6<8,符合顺序,无需互换位置:
在这里插入图片描述
第4轮的第2次比较:5与8进行比较,8>5,不符合顺序,这是互换位置后的结果:
第四轮结果:6 5 8 9 11 13
在这里插入图片描述
第5轮的第1次比较:6与5进行比较,6>5,不符合顺序,这是互换位置后的结果:
在这里插入图片描述
第五轮结果:5 6 8 9 11 13,到目前为止,排序完成
那么大家可以思考这么几个问题:

  1. 一共有几个元素参与比较?(6个)
  2. 一共比较了几轮?(5轮)
  3. 每一轮是怎么比较的?(相邻比较,顺序不对就互换)
  4. 每轮的结果?(每轮都会确定一个最大的元素)
  5. 有哪些相邻元素可以不参与比较?(之前轮确认的最大值)

3 实现冒泡排序

那如果通过编程,我们该怎么实现呢?
如下图:我们可以通过嵌套for循环来实现:
外层循环来控制比较的轮数:最大轮数=个数-1
内层循环来控制每轮比较的次数
在比较过程中,如果顺序不对,就互换元素的位置
冒泡排序
创建类: BubbleSort.java

package cn.tedu.array;

import java.util.Arrays;

/**本类用来完成冒泡排序*/
public class TestBubbleSort { 
   
	public static void main(String[] args) { 
   
		//1.创建一个无序的数组
		int[] a = { 
   27,96,73,25,21};
		//2.调用method()完成排序
		int[] newA = method(a);
		System.out.println("排序完毕:"+Arrays.toString(newA));
	}
	public static int[] method(int[] a) { 
   
		//1.外层循环,控制比较的轮数,假设有n个数,最多比较n-1次
		//开始值:1 结束值:<= a.length-1 变化:++
		//控制的是循环执行的次数,比如5个数,最多比较4轮,<= a.length-1,最多取到4,也就是[1,4]4次
		for(int i = 1 ; i <= a.length-1 ; i++) { 
   
			System.out.println("第"+i+"轮:");
			//2.内层循环:相邻比较+互换位置
			for(int j=0; j < a.length-i ; j++) { 
   
				//相邻比较,a[j]代表的就是前一个元素,a[j+1]代表的就是后一个元素
				if(a[j] > a[j+1]) { 
   
					//交换数据
					int t = a[j];
					a[j] = a[j+1];
					a[j+1] = t;
					//System.out.println("第"+(j+1)+"次比较交换后:"+Arrays.toString(a));
				}
			}
			System.out.println("第"+i+"轮的结果:"+Arrays.toString(a));
		}
		return a;//把排序好的数组a返回
	}
}

其实我们还可以对现有的排序做优化:
优化1:前面几轮排序产生的最大值不需要参与后几轮的比较,执行过几轮就会产生几个值不需要参与比较 , i 轮产生 i 个值,所以需要 – i

优化2:我们要设置一个量,这个量用来检测在当前这一轮的相互比较中究竟有没有发生元素的互换位置,如果发生了互换,说明顺序还没排好,flag就改成true,进行下一轮比较,但是如果在当前轮,所有元素都进行了相互比较,并没有互换位置,这就说明顺序已经排好序了,无需下一轮比较,直接return结束方法即可
在这里插入图片描述

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161831.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PAT乙级题目对应知识点分类梳理

    PAT乙级题目对应知识点分类梳理PAT乙级的90道题的知识点与对应的题号整理如下,便于做专项练习和巩固!1、字符串函数考察字符串相关知识,如逆转、字母与数字的判断与转化、字符串拼接、字符串比较题号:1002、1006、1009、1014、1021、1024、1031/1039、1042、1043、/1048/1052/1054/1058/1067/1079、1081/1084/1086、2、STL容器考察ST…

    2022年5月4日
  • http://95u.free.fr/index.php,Electronic Software Distribution Service

    http://95u.free.fr/index.php,Electronic Software Distribution ServiceContent-Type:multipart/related;start=;boundary=———-OH5LlQ9dynBJGqR8E2AiMRContent-Location:https://software.pitt.edu/software/software.aspSubject:=?utf-8?Q?Electronic=20Software=20Distributi…

    2022年7月24日
  • Centos7安装mysql8.0教程

    Centos7安装mysql8.0教程准备工作1.查看是否有安装过mysqlrpm-qa|grep-imysql2.删除mysqlyum-yremoveMySQL-*一般用rpm-e的命令删除mysql,这样表面上删除了mysql,可是mysql的一些残余程序仍然存在,并且通过第一步的方式也查找不到残余,而yum命令比较强大,可以完全删除mysql.(ps:用rpm删除后再次安装的时候会提示已经安装…

    2022年6月5日
  • 数据库主从复制_sqlserver主从复制

    数据库主从复制_sqlserver主从复制一、什么是主从复制?主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是准实时的业务数据库。二、主从复制的作用(好处,或者说为什么要做主从)重点!1、架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,物理服务器增加,负荷增加。2、读写分离,使数据库能支撑更大的并发。主从只负责各自的写和读,极大程度的缓解X锁和S锁争用。在报表中尤其重要。由于部分报表sql语句非常的慢,导致锁表,影响前台服务。如果前台使用master,报表使用slave,那

    2022年8月13日
  • MATLAB强化学习入门——三、深度Q学习与神经网络工具箱

    MATLAB强化学习入门——三、深度Q学习与神经网络工具箱零、为什么需要深度Q学习上一期的文章《网格迷宫、Q-learning算法、Sarsa算法》的末尾,我们提到了Q学习固有的缺陷:由于智能体(agent)依赖以状态-动作对为自变量的Q函数表(QFunctionTable)来形成对当前状态的估计,并以此为依据利用策略π选择动作。Q函数表就必须包含智能体在环境中所可能出现的所有动作-状态对及其对应Q值。显然,当一个多步决策问题变得足够复杂甚至变为连…

    2022年10月3日
  • Echarts折线图案例

    Echarts折线图案例问题:重置echarts折线图时,总会出现多个数据的拐点,与实际渲染的数据拐点不符合。解决:在实例化echarts后clear上一次的图。myEcharts.clear()案例constoption={//触摸echarts图的提示内容tooltip:{//是否显示提示框show:true,//触发类型://’item’:主要在散点图,饼图等无类目轴的图表中使用

    2022年11月3日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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