关于java的冒泡排序

关于java的冒泡排序

我们前面的文章中了解到了数组的方法类Arrays,我们本篇文章来了解一下最出名的排序算法之一,冒泡排序!😀

冒泡排序的代码还是非常简单的,两层循环,外层冒泡轮数,里层依次比较,江湖中人人皆知!

冒泡排序逻辑

1、比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换位置。

2、每一次比较都会产生出一个最大,或者最小的数字。

3、下一轮则可以少一次排序

4、依次循环,直到结束。

我们下面直接用代码来进行说明,方便大家更好的理解😊。

在看代码之前,我们先来说明一个问题,因为冒泡排序是比较相邻的元素,比较大小然后对换位置,有时候为了图方便,直接写成了下面的代码进行对换。

复制代码
a = b;
b = a;

因为b已经赋值给a了,所以再次赋值的话a和b是相等的,没有意义。

我们可以用换饮料的方式,给大家说明一下😉

假如有一杯西瓜汁和一杯芒果汁,需要把饮料互换,芒果汁倒入西瓜汁的杯子,西瓜汁倒入芒果汁的杯子。

我们这个时候,就可以拿来一个空杯子,先把西瓜汁倒入空杯子,再把芒果汁倒入西瓜汁的杯子,然后空杯子里面的西瓜汁再倒入芒果汁的杯子里面,这个空的杯子就是我们定义的临时变量。

java 复制代码
import java.util.Arrays;

public class Demo
{
	public static void main(String[] args)
	{
		int[] a = {1,22,34,2,88,76,98}; //声明一个数组并赋值
        int[] sort=sort(a);
        System.out.print(Arrays.toString(sort));
	}
	
	//冒泡排序
	public static int[] sort(int[] array)
	{
		int temp=0;//定义一个临时变量
		for(int i = 0;i<array.length-1;i++)//外层循环,判断循环次数
		{
			for(int j=0;j<array.length-1-i;j++)//内层循环,如果第一个数比第二个数大,则交换位置
			{
				if(array[j+1]<array[j])
				{
					temp=array[j+1];
					array[j]=array[j+1]; //换杯子
					array[j+1]=temp;
				}
			}
		}
        
        return array;
	}
}

我们来执行一下代码,可以看到下面的内容。

java 复制代码
[1, 2, 22, 34, 76, 88, 98]

进程结束......

我们这个输出的结果是正序排列的,我们如果像倒序排列的话,只需要arrayj+1>arrayj,让后一个大于前一个即可。

java 复制代码
import java.util.Arrays;

public class Demo
{
	public static void main(String[] args)
	{
		int[] a = {1,22,34,2,88,76,98}; //声明一个数组并赋值
        int[] sort=sort(a);
        System.out.print(Arrays.toString(sort));
	}
	
	//冒泡排序
	public static int[] sort(int[] array)
	{
		int temp=0;//定义一个临时变量
		for(int i = 0;i<array.length-1;i++)//外层循环,判断循环次数
		{
			for(int j=0;j<array.length-1-i;j++)//内层循环,如果第一个数比第二个数大,则交换位置
			{
				if(array[j+1]>array[j])
				{
					temp=array[j+1];
					array[j]=array[j+1]; //换杯子
					array[j+1]=temp;
				}
			}
		}
        
        return array;
	}
}

我们来执行一下代码,可以看到下面的内容。

java 复制代码
[98, 88, 76, 34, 22, 2, 1]

进程结束......

优化冒泡排序

我们上面的代码中,是比较两个数的大小,冒泡排序中这个算法的时间复杂度为O(n2)。

我们可以考虑,如果其中的两个数,已经有序了,比如1,22,34,2,88,76,98 22和34已经是排好序的了,就可以省去这部分的时间。

java 复制代码
import java.util.Arrays;

public class Demo
{
	public static void main(String[] args)
	{
		int[] a = {1,22,34,2,88,76,98}; //声明一个数组并赋值
        int[] sort=sort(a);
        System.out.print(Arrays.toString(sort));
	}
	
	//冒泡排序
	public static int[] sort(int[] array)
	{
		int temp=0;//定义一个临时变量
		for(int i = 0;i<array.length-1;i++)//外层循环,判断循环次数
		{
            boolean flag=false;//通过flag减少没有意义的比较
			for(int j=0;j<array.length-1-i;j++)//内层循环,如果第一个数比第二个数大,则交换位置
			{
				if(array[j+1]>array[j])
				{
					temp=array[j+1];
					array[j]=array[j+1]; //换杯子
					array[j+1]=temp;
                    flag=true;
				}
			}
            if(flag==false)
            {
                break;
            }
		}
        return array;
	}
}

我们增加一个布尔类型的判断,如果排序存在就不去执行比较,这样可以节省部分时间,因为数据量大的时候,节省1秒钟也是非常关键的!我们来执行一下代码,可以看到输出的内容没有变化。

java 复制代码
[98, 88, 76, 34, 22, 2, 1]

进程结束......

所以我们在写程序的时候,尽量多去研究优化点,节省运行时间,执行效率提升改善~😎

相关推荐
努力实干2 分钟前
C++ 面向对象与工程架构
开发语言·c++·架构
十年Java程序媛8 分钟前
JVM 基础与 GC 垃圾回收详解|可达性分析、分代模型、垃圾收集器、STW
java·开发语言·jvm·spring boot·后端·面试
估值探索者9 分钟前
【Python量化选股流水线 #03】候选股怎么排序?动量+低波+流动性三因子打分取 Top-N
开发语言·python·接口·api接口·股票数据接口·数据接口·股票数据api接口
骑士雄师10 分钟前
supervisor 中关于上下文多轮信息维护常用到的python语法
开发语言·python
青少儿编程课堂17 分钟前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C/C++考级:任意进制互转与大数多进制加法解析
c++·python·算法·bfs·信息学竞赛
曹牧19 分钟前
C#:字符串占位符与值数量不一致
开发语言·数据库·c#
2301_322414280421 分钟前
基于SSM框架的在线考试管理系统的设计与实现14750-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·redis·mysql·tomcat·maven·mybatis·ssm
clz131452127 分钟前
RuoYi-Cloud 新建微服务并实现服务间调用(OpenFeign 实战)
java·ruoyi
迅猛龙办公室27 分钟前
Python函数实现反转一个只有3位数的整数
开发语言·前端·python
“AI国潮设计-小江”30 分钟前
《【AIGC实战】Python+SDXL批量生成“英歌舞树莓香草布丁”IP,附保持角色一致性的代码逻辑》
开发语言·人工智能·python·prompt·aigc