冒泡排序,详详解解

目录

基本概念:  

上图:

核心思路:

基本步骤:

关键:

代码核心:

补充:

代码(规范) :

代码(优化):


今天我们不刷力扣了,我们来复习(手撕)一下数据结构中的八大排序算法之一,冒泡排序

基本概念:  

所谓的冒泡排序,即通过对待排序序列从前向后(从下标较小的元素开始),依次对相邻两个元素的值进行两两比较,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就如果水底下的气泡一样逐渐向上冒。

上图:

核心思路:

对一组数字进行重复遍历,两两相邻进行比较,若前者比后者大则交换位置,直到所有数字呈现升序即从小到大。

基本步骤:

 1.首先比较相邻的元素,即若第一位元素大于第二位,则将前后两个元素进行交换

 2.接着从左到右依次比较,第一轮排序后,最大元素在最后,第二轮排序后,第二大元素在倒数第二,依次类推,最后直到所有元素在合适的大小位置

关键:

设总的元素个数为n,那么由上边的排序过程可以看出:

(1)总计需要进行(n-1)轮排序,也就是(n-1)次大循环

(2)每轮排序比较的次数逐轮减少

(3)每比较一轮就会有一个较大的元素排在后面,即下一轮需要比较的元素个数-1。

代码核心:

这里代码不是规范的写法,但这是冒泡排序算法的核心代码部分

 int arr[] = {3,2,7,4,1}; //定义一个数组用于存储数据和排序  int temp;//临时变量// 注意:这里有两层循环//第一层正常的从0开始遍历数组,这里记录 比较的轮数,也是不需要参加当前比较的元素个数for (int i = 0; i < arr.length-1; i++) {//第二层,比较的元素个数-i,即不需要参加当前比较的元素个数for (int j = 0; j < arr.length-1-i; j++){//这里判断如果前者大于后者就互相交换位置if (arr[j]>arr[j+1]){temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}

补充:

简单理解。第一层循环是记录总的比较轮数,而第二层 是记录具体每轮比较的元素个数 

代码(规范)

public class Sort {public static void main(String[] args) {//示例数据int arr[] = {3,2,7,4,1};System.out.println("====Before====");System.out.println(Arrays.toString(arr));//进行排序BubbleSort(arr);//展示结果System.out.println("====After====");System.out.println(Arrays.toString(arr));}//冒泡排序public static void  BubbleSort(int arr[]){int temp;for (int i = 0; i < arr.length-1; i++) {for (int j = 0; j < arr.length-1-i; j++){if (arr[j]>arr[j+1]){temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}}}
}

代码(优化):

这里可优化在于,如果发现在某趟排序中,没有发生一次交换, 可以提前结束冒泡排序。

解决方式:可以通过一个标志位来进行判断 

//测试冒泡排序
public class BubbleSort {public static void main(String[] args) {int[] arr = {3,1,4,6,22,0,33,2,745,5,56,8};//  System.out.println("values数组原始顺序:"+Arrays.toString(arr));bubbleSort(arr);}public static void bubbleSort(int[] arr){//把冒泡排序的方法设置成static静态的,不允许改变代码;int temp;//定义一个布尔类型的变量,标记数组是否已到达有序状态;boolean flag = false;for(int i=0;i<arr.length;i++){//内循环,每一趟循环都从数列的前两个元素开始进行比较,比较到无序数组的最后;for (int j=0; j<arr.length-1-i;j++){//如果前一个元素大于后一个元素,则交换两元素的值;if (values[j] > values[j+1]){//进入这个if分支里边,则说明有元素进行了交换//所以将flag=trueflag = true;temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;}}//在进行完一轮的排序之后,判断本轮是否发生了元素之间的交换//如果没有发生交换,说明数组已经是有序的了,则直接结束排序
;if (flag){break;}else {//如果发生了交换,那么在下一轮排序之前将flag再次置为false//以便记录下一轮排序的时候是否会发生交换flag = false;}// System.out.println((i+1)+"趟排序:"+ Arrays.toString(arr));}}
}

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

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

相关文章

HTML5、CSS3面试题(二)

上一章:HTML5、CSS3面试题&#xff08;一&#xff09; 哪些是块级元素那些是行内元素&#xff0c;各有什么特点 &#xff1f;&#xff08;必会&#xff09; 行内元素: a、span、b、img、strong、input、select、lable、em、button、textarea 、selecting 块级元素&#xff1…

Rust中derive宏的作用及常用trait

在Rust代码经常可以看到在struct的上面&#xff0c;有一行#[derive(Clone, Debug)]这样的代码。dervice是Rust的内置宏&#xff0c;可以自动为struct或是enum实现某些的trait。 在下面的代码中&#xff0c;Book struct 通过derive宏自动实现了Debug、Clone和PartialEq这三个tra…

idea操作

我的一些总结&#xff0c;后续会陆续添加 代码编辑相关&#xff1a; 格式化代码&#xff1a;Ctrl Alt L (Windows) / Command Option L (Mac) 快速修复&#xff1a;Alt Enter 查找定义&#xff1a;Ctrl 鼠标左键单击 (Windows) / Command 鼠标左键单击 (Mac) 多行编辑…

vue3 打印局部网页、网页下载为图片、下载为pdf-自动分页,几行代码搞定

经常有一些需求&#xff0c;要将网页保存为一张图片&#xff0c;感觉异常困难&#xff0c;这里发现一个简单的办法。 这么简单&#xff0c;直接一句哇塞&#xff0c;老板&#xff1a;马上完成任务。 先安装几个依赖 npm i howuse html2canvas jspdf 下载图片代码 <button …

L1 - 006 连续因子

思路&#xff1a;1.要求最长的连续因子序列&#xff0c;我们需要知道序列的长度和序列的起点。 2.对于起点 i 来说&#xff0c;他不能超过 n 的平方根&#xff0c;在循环时从 2 到 sqrt(n) 。用到变量&#xff1a;记录个数num&#xff0c;起点start&#xff0c;最大个数maxnum…

Qt篇——QChartView获取鼠标停留位置的数值

需求&#xff1a;鼠标停留在QChartView上时&#xff0c;想要计算停留位置的数值。 一开始的方法是想要通过鼠标移动事件计算鼠标在QChartView上的坐标&#xff0c;在换算成数值&#xff0c;后来发现QChartView中除了图表数据&#xff0c;还有坐标轴与坐标轴数值标签占了高度&a…

How to install teams in ubuntu

Download deb file download link: https://mirrors.sdu.edu.cn/spark-store-repository/store/office/teams/ install deb sudo apt install ./teams_1.5.00.23861_amd64.deb open and login teams.

基于单片机的车载酒精含量自检系统设计与实现

摘要:调查显示,大约50%的交通事故与酒后驾车有关,酒后驾车已成为车祸致死的首要原因。为从根本上杜绝酒后驾车,设计了一款基于STC89C52 单片机的车载酒精含量自检系统,该系统能很好地解决酒驾问题,控制简单、使用方便,具有很好的应用价值。 关键词:STC89C52 单片机;车…

ubuntu编译rk3588异常

问题现象 在ubuntu上编译 rk3588 的kernel时&#xff0c;报如下错误&#xff1a; LZ4C arch/arm64/boot/Image.lz4 Incorrect parameters Usage : lz4 [arg] [input] [output] input : a filename with no FILE, or when FILE is - or stdin, read sta…

JavaEE企业开发新技术2

目录 2.7 Field类的基本概念 文字性概念描述&#xff1a; Field类 2.8 Field的基本操作-1 2.9 Field的基本操作-2 分析&#xff1a; 2.10 Field 的综合练习 总结&#xff1a; 和equals的区别&#xff1a; 使用 比较 使用equals比较 2.7 Field类的基本概念 文字性…

.NET高级面试指南专题十七【 策略模式模式介绍,允许在运行时选择算法的行为】

介绍&#xff1a; 策略模式是一种行为设计模式&#xff0c;它允许在运行时选择算法的行为。它定义了一系列算法&#xff0c;将每个算法封装到一个对象中&#xff0c;并使它们可以互相替换。这使得算法可独立于使用它的客户端变化。 原理&#xff1a; 策略接口&#xff08;Strat…

CVPR2024 | 大核卷积新高度101x101,美团提出PeLK

https://arxiv.org/pdf/2403.07589.pdf 本文概述 最近&#xff0c;一些大核卷积网络以吸引人的性能和效率进行了反击。然而&#xff0c;考虑到卷积的平方复杂度&#xff0c;扩大内核会带来大量的参数&#xff0c;而大量的参数会引发严重的优化问题。由于这些问题&#xff0c;当…

安卓之四大组件

组件描述Activity(活动)在应用中的一个Activity可以用来表示一个界面&#xff0c;意思可以理解为“活动”&#xff0c;即一个活动开始&#xff0c;代表 Activity组件启动&#xff0c;活动结束&#xff0c;代表一个Activity的生命周期结束。一个Android应用必须通过Activity来运…

蓝桥杯刷题|01入门真题

[蓝桥杯 2020 省 AB1] 解码 题目描述 小明有一串很长的英文字母&#xff0c;可能包含大写和小写。 在这串字母中&#xff0c;有很多连续的是重复的。小明想了一个办法将这串字母表达得更短&#xff1a;将连续的几个相同字母写成字母 出现次数的形式。 例如&#xff0c;连续…

Xcode 15.3 Archive失败

Xcode 15.3 Archive失败 背景 升级 Xcode 到 15.3&#xff0c;真机运行正常。打包的时候发现 Archive 失败。 提示&#xff1a; Call parameter type does not match function signature! 仔细看报错里是和HandyJSON相关的提示。 解决 起初以为和 Pod 库有关系&#xff0c;…

docker容器启动rabbitmq

docker容器启动rabbitmq 一、RabbitMQ部署1.1.在线拉取mq镜像1.2.运行mq容器1.3.访问mq 二、RabbitMQ的集群2.1.集群分类2.1.设置 /etc/hosts文件 endl 一、RabbitMQ部署 1.1.在线拉取mq镜像 # 在线拉取 docker pull rabbitmq:3-management1.2.运行mq容器 docker run \ -e R…

什么是单向数据流

单向数据流是一种数据流动的模式&#xff0c;通常用于前端框架&#xff08;如 React、Vue 等&#xff09;中。在单向数据流中&#xff0c;数据只能从一个方向流向另一个方向&#xff0c;不会出现数据的双向流动。这种模式有助于简化数据的管理和状态的维护&#xff0c;提高代码…

Kafka-生产者报错javax.management.InstanceAlreadyExistsException

生产者发送消息到 kafka 中,然后控制台报错 然后根据日志查看 kafka 的源码发现了问题原因 说的是MBean已经注册了,然后报异常了,这样就会导致生产者的kafka注册失败, 原因是项目上生产者没有配置clientId,默认都是空导致的, 多个生产者(项目)注册到kafka集群中的 id 都相同。 …

微服务分布式基于Springcloud的拍卖管理系统597wx

越来越多的用户利用互联网获得信息&#xff0c;但各种信息鱼龙混杂&#xff0c;信息真假难以辨别。为了方便用户更好的获得信息&#xff0c;因此&#xff0c;设计一种安全高效的拍卖管理系统极为重要。 为设计一个安全便捷&#xff0c;并且使用户更好获取拍卖管理系统&#xff…

在Linux/Ubuntu/Debian中使用lsof和fuser查看/解除文件占用

“lsof”&#xff08;列出打开的文件&#xff09;和“fuser”&#xff08;使用文件识别进程&#xff09;类似&#xff0c;但功能略有不同&#xff1a; 1.lsof&#xff1a; - lsof 列出有关进程打开的文件的信息。 它提供有关打开哪些文件、哪些进程正在访问这些文件以及其他相…