关于java的冒泡排序

关于java的冒泡排序

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

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

冒泡排序逻辑

1、比较数组中,两个相邻的元素,如果第一个数比第二个数大,我们就交换位置。
2、每一次比较都会产生出一个最大,或者最小的数字。
3、下一轮则可以少一次排序
4、依次循环,直到结束。

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

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

a = b;
b = a;

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

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

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

在这里插入图片描述

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

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;}
}

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

[1, 2, 22, 34, 76, 88, 98]进程结束......

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

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;}
}

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

[98, 88, 76, 34, 22, 2, 1]进程结束......

优化冒泡排序

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

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

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秒钟也是非常关键的!我们来执行一下代码,可以看到输出的内容没有变化。

[98, 88, 76, 34, 22, 2, 1]进程结束......

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

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

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

相关文章

日志系统一(elasticsearch+filebeat+logstash+kibana)

目录 一、es集群部署 安装java环境 部署es集群 安装IK分词器插件 二、filebeat安装&#xff08;docker方式&#xff09; 三、logstash部署 四、kibana部署 背景&#xff1a;因业务需求需要将nginx、java、ingress日志进行收集。 架构&#xff1a;filebeatlogstasheskib…

TypeScript基础(五)泛型

✨ 专栏介绍 TypeScript是一种由微软开发的开源编程语言&#xff0c;它是JavaScript的超集&#xff0c;意味着任何有效的JavaScript代码都是有效的TypeScript代码。TypeScript通过添加静态类型和其他特性来增强JavaScript&#xff0c;使其更适合大型项目和团队开发。 在TypeS…

2022 年全国职业院校技能大赛高职组云计算赛项试卷部分解析

2022 年全国职业院校技能大赛高职组云计算赛项试卷部分解析 【赛程名称】高职组-云计算赛项第一场-私有云【任务 1】私有云服务搭建[10 分]【题目 2】Yum 源配置[0.5 分]【题目 3】配置无秘钥 ssh[0.5 分]【题目 4】基础安装[0.5 分]【题目 5】数据库安装与调优[0.5 分]【题目 …

再谈前端算法

楔子 – 青蛙跳台阶什么是算法算法实例 &#xff1a; 实现一个LRU缓存 实现 LRUCache扩展&#xff1a; ES6 Map Map的创建和初始化&#xff1a;添加键值对&#xff1a;获取键值对&#xff1a;检查Map中是否存在某个键&#xff1a;删除键值对&#xff1a;遍历Map&#xff1a;获取…

Python综合数据分析_RFM用户分组模型

文章目录 1.导入数据2.月度订单数据可视化3.数据清洗4.特征工程5.构建User用户表6.求R值7.求F值8.求M值9.显示R、F、M值的分布情况10.显示手肘图辅助确定K值11.创建和训练模型12.给R值聚类13.给聚类后的层级排序14.继续给F、M值聚类&#xff0c;并排序15.为用户整体分组画像 1.…

数据库连接池配置生成、读取二维码集成多数据源入参字段定义为Date类型,支持时间戳及年-月-日

数据库连接池配置 # 数据源配置 spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.cj.jdbc.Driverdruid:# 主库数据源master:url: jdbc:mysql://localhost:3306/database?useUnicodetrue&characterEncodingutf8&zeroDateT…

数据库:如何取消mysql的密码

因为调试MySQL数据接口&#xff0c;总是需要输入密码很烦&#xff0c;所以决定取消mysql的root密码&#xff0c; 网上推荐的有两种方法&#xff1a; 1、mysql命令 SET PASSWORD FOR rootlocalhostPASSWORD(); 2、运行 mysqladmin 命令 mysqladmin -u root -p password …

Docker与微服务实战(基础篇)

Docker与微服务实战&#xff08;基础篇&#xff09; 1、Docker简介2、Docker安装步骤1.Centos7及以上的版本2.卸载旧版本3.yum安装gcc相关4.安装需要的软件包5.设置stable镜像仓库【国内aliyun】6.更新yum软件包索引--以后安装更快捷7.安装Docker-Ce8.启动Docker9.测试10.卸载1…

2024.01.09.Apple_UI_BUG

我是软件行业的&#xff0c;虽然不是手机设计的&#xff0c;但是这个设计真的导致经常看信息不完整&#xff0c;要下拉的。 特别读取文本或者其他文件的时候&#xff0c;上面有个抬头就是看不到&#xff0c;烦&#xff0c;体验感很差

解决在eclipse2021中,用mysql-connector-java-8.0.18.jar不兼容,导致无法访问数据库问题

1.环境场景 组件版本mysql5.7.44mysql-connector-java80.18 2. 问题描述 报mysql-connector-java 驱动连不上mysql数据库。 3. 可能的原因分析 查看数据库连接句柄是否对 如果数据库连接句柄中没有 useSSLfalse 的话可能会导致这样的问题。 就像下面这样&#xff1a; jdb…

MySQL的导入导出及备份

一.准备导入之前 二.navicat导入导出 ​编辑 三.MySQLdump命令导入导出 四.load data file命令的导入导出 五.远程备份 六. 思维导图 一.准备导入之前 需要注意&#xff1a; 在导出和导入之前&#xff0c;确保你有足够的权限。在进行导入操作之前&#xff0c;确保目标数据…

【npm link】Node命令中的npm link命令的使用,还有CLI全局命令的使用,开发命令行工具必不可少的部分

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;NodeJs &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&#xff0c;最重要的是继续前进的勇气…