基础算法02——冒泡排序(Bubble Sort)

冒泡排序(Bubble Sort)

  1. 冒泡排序:是一种简单的排序算法,其基本思想是通过重复遍历要排序的列表,比较相邻的元素,并在必要时(即前面的数比后面的数大的时候)交换它们的位置,从而将较大的元素逐渐“冒泡”到列表的末尾。这个过程会重复进行(第一次把最大的元素放在列表的末尾,第二次把第二大的元素放在列表的倒数第二的位置,以此类推,只需执行(数组的长度-1次)这个过程即可),直到整个列表被排序。
    • 冒泡排序主要有两个for循环组成
      • 外层for循环主要用于控制数组循环遍历的次数
        • 数组的长度决定要遍历的次数
      • 内层for循环主要用于元素位置的交换(把较大的元素往后移动)

冒泡排序初代代码:减少比较次数

  • 优化点:每经过一轮冒泡,内层循环就可以减少一次
public class BubbleSort {public static void main(String[] args) {int[] arr ={24,69,80,57,13};System.out.println("排序前的数组:");printArray(arr);bubbleSort(arr);System.out.println("排序后的数组:");printArray(arr);}/*** 冒泡排序算法* @param arr:数组*/public static void bubbleSort(int[] arr) {int n = arr.length; // 数组长度// 外层循环是控制数组循环遍历的次数:默认要循环【数组的长度-1】遍,每遍历一次子循环的比较次数就减少一次(因为每次子循环会把最大的一个元素放在数组的最后)for (int i = 0; i < n - 1; i++) {// 内层循环控制每一次循环的比较和元素的交换(一轮冒泡)for (int j = 0; j < n - 1 - i; j++) {  // n-1-i表示要比较的元素的个数if (arr[j] > arr[j + 1]) { // 如果前一个元素大于后一个元素,则交换int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;swapped = true; // 当数组元素发生交换说明数组当前不是有序的}}}}// 打印数组public static void printArray(int[] arr) {for (int num : arr) {System.out.print(num + " ");}System.out.println();}}

案例分析

  1. 以int[] arr= {24,69,80,57,13};举例
    • 外层for循环第1轮:把最大的数放在最后的位置
      • 前一个数和后一个数比较,如果前者大就交换位置(内层for循环)
        • 第1次比较[24,69,80,57,13] 第1个和第2个比
        • 第2次比较[24,69,80,57,13] 第2个和第3个比
        • 第3次比较[24,69,57,80,13] 第3个和第4个比(80比57大,所以80和57交换位置
        • 第4次比较[24,69,57,13,80] 第4个和第5个比(80比13大,所以80和13交换位置
    • 外层for循环第2轮:把第二大的数放在倒数第二个位置
      • 前一个数和后一个数比较,如果前者大就交换位置(内层for循环)
        • 第1次比较[24,69,57,13,80] 第1个和第2个比
        • 第2次比较[24,57,69,13,80] 第2个和第3个比
        • 第3次比较[24,57,13,69,80] 第3个和第4个比
    • 外层for循环第3轮:把第三大的数放在倒数第三个位置
      • 前一个数和后一个数比较,如果前者大就交换位置(内层for循环)
        • 第1次比较[24,57,13,69,80] 第1个和第2个比
        • 第2次比较[24,13,57,69,80] 第2个和第3个比
    • 外层for循环第4轮:把第四大的数放在倒数第四个位置
      • 前一个数和后一个数比较,如果前者大就交换位置(内层for循环)
        • 第1次比较[13,24,57,69,80] 第1个和第2个比
  • 总结
      1. 一共有5个元素(数组的长度为n,n=5)
      1. 一共进行了4轮排序(需要进行n-1轮排序)
      1. 每一轮排序可以确定一个数的位置,比如第一轮排序确定最大的数…
      1. 当进行比较时,如果前面的数大于后面的数,就交换
      1. 每轮的比较次数在减少4->3->2->1

冒泡排序改进代码:通过swapped变量减少冒泡次数

  • 优化点:如果某一轮冒泡没有发生交换,则表示所有数据有序,可以结束外层循环
public class BubbleSort {public static void main(String[] args) {int[] arr ={24,69,80,57,13};System.out.println("排序前的数组:");printArray(arr);bubbleSort(arr);System.out.println("排序后的数组:");printArray(arr);}/*** 冒泡排序算法* @param arr:数组*/public static void bubbleSort(int[] arr) {int n = arr.length; // 数组长度boolean swapped;// 外层循环是控制数组循环遍历的次数:默认要循环【数组的长度-1】遍,每遍历一次子循环的比较次数就减少一次(因为每次子循环会把最大的一个元素放在数组的最后)for (int i = 0; i < n - 1; i++) {swapped = false;  // 判断数组是否有序,false表示有序(默认)// 内层循环控制每一次循环的比较和元素的交换(一轮冒泡)for (int j = 0; j < n - 1 - i; j++) {  // n-1-i表示要比较的元素的个数if (arr[j] > arr[j + 1]) { // 如果前一个元素大于后一个元素,则交换int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;swapped = true; // 当数组元素发生交换说明数组当前不是有序的}}// 如果某一趟没有发生交换,说明数组已经有序,提前退出if (!swapped) {break;}}}// 打印数组public static void printArray(int[] arr) {for (int num : arr) {System.out.print(num + " ");}System.out.println();}}

冒泡排序最终实现

  • 优化点:用一个死循环作为外层循环,每次通过记录最后一次交换索引位置进行判断,如果在索引为0的位置,则可以结束循环。
public class BubbleSort {public static void main(String[] args) {int[] arr ={24,69,80,57,13};System.out.println("排序前的数组:");printArray(arr);bubbleSort(arr);System.out.println("排序后的数组:");printArray(arr);}/*** 冒泡排序算法* @param arr:数组*/public static void bubbleSort(int[] arr) {int n = a.length - 1;while (true) {int last = 0; // 表示最后一次交换索引位置for (int i = 0; i < n; i++) {System.out.println("比较次数" + i);if (a[i] > a[i + 1]) {int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;last = i;}}n = last;System.out.println("第轮冒泡"+ Arrays.toString(a));if (n == 0) { // 表示最后一次交换索引位置break;}}}// 打印数组public static void printArray(int[] arr) {for (int num : arr) {System.out.print(num + " ");}System.out.println();}}
  • 一直冒泡,每轮冒泡时,最后一次交换的索引可以作为下一轮冒泡的比较次数,如果这个值为零,表示整个数组有序,直接退出外层循环即可。

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

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

相关文章

RestTemplate远程调用接口方式

1.Post(body空参) 也就是说需要给一个空的json 代码: String getDeviceUrl this.MOVABLE_URL "detected-data/getMachineLists"; // 远程调用 RestTemplate restTemplate new RestTemplate(); restTemplate.getMessageConverters().set(1,new StringHttpMessageC…

ar头显和眼镜图像特效处理

使用一个线程从摄像头或者其他设备循环读取图像数据写入链表&#xff0c;另一个线程从链表循环读取数据并做相应的特效处理&#xff0c;由于写入的速度比读取的快&#xff0c;最终必然会因为写入过快导致线程读写一帧而引发冲突和数据帧正常数据帧被覆盖。最好使用共享内存&…

mysql--socket报错

错误原因分析 MySQL 服务未运行&#xff08;最常见原因&#xff09; 错误中的 (2) 表示 “No such file or directory”&#xff0c;即 /tmp/mysql.sock 不存在这通常意味着 MySQL 服务器根本没有启动 socket 文件路径不匹配 客户端尝试连接 /tmp/mysql.sock但 MySQL 服务器可…

labview加载matlab数据时报错提示:对象引用句柄无效。

1. labview报错提示 labview加载mat数据时报错提示&#xff1a;对象引用句柄无效。返回该引用句柄的节点可能遇到错误&#xff0c;并没有返回有效的引用句柄。该引用句柄所指的存储可能在执行调用之前已关闭。报错提示如下&#xff1a; 这是由于labview缺少matlab MathWorks导…

面试计算机操作系统解析(一中)

判断 1. 一般来说&#xff0c;先进先出页面置换算法比最近最少使用页面置换算法有较少的缺页率。&#xff08;✘&#xff09; 正确答案&#xff1a;错误解释&#xff1a;FIFO&#xff08;先进先出&#xff09;页面置换算法可能导致“Belady异常”&#xff0c;即页面数增加反而…

如何防御TCP洪泛攻击

TCP洪泛攻击&#xff08;TCP Flood Attack&#xff09;是一种常见的分布式拒绝服务&#xff08;DDoS&#xff09;攻击手段&#xff0c;以下是其原理、攻击方式和危害的详细介绍&#xff1a; 定义与原理 TCP洪泛攻击利用了TCP协议的三次握手过程。在正常的TCP连接建立过程中&a…

20250330 Pyflink with Paimon

1. 数据湖 2. 本地安装Pyflink和Paimon 必须安装Python 3.11 Pip install python -m pip install apache-flink1.20.1 需要手动加入这两个jar 测试代码&#xff1a; import argparse import logging import sys import timefrom pyflink.common import Row from pyflink.tab…

-PHP 应用SQL 盲注布尔回显延时判断报错处理增删改查方式

#PHP-MYSQL-SQL 操作 - 增删改查 1 、功能&#xff1a;数据查询(对数据感兴趣&#xff09; 查询&#xff1a; SELECT * FROM news where id$id 2 、功能&#xff1a;新增用户&#xff0c;添加新闻等&#xff08;对操作的结果感兴趣&#xff09; 增加&#xff1a; INSERT INT…

【学习记录】大模型微调之使用 LLaMA-Factory 微调 Qwen系列大模型,可以用自己的数据训练

一、LoRA微调的基本原理 1、基本概念 LoRA&#xff08;Low-Rank Adaptation&#xff09;是一种用于大模型微调的技术&#xff0c;通过引入低秩矩阵来减少微调时的参数量。在预训练的模型中&#xff0c;LoRA通过添加两个小矩阵B和A来近似原始的大矩阵ΔW&#xff0c;从而减少需…

Vue 使用 xlsx 插件导出 excel 文件

安装与引入 安装 npm install xlsx npm install file-saver # 或者 yarn add xlsx yarn add file-saver 引入 import * as XLSX from xlsx; import FileSaver from file-saver 基本功能 读取 Excel 文件 // 读取文件内容 const workbook XLSX.readFile(path/to/file.xl…

vulntarget_a 训练笔记

win 7 权限 利用任意文件上传 getshell POST /module/ueditor/php/action_upload.php?actionuploadfile HTTP/1.1 User-Agent: Mozilla/5.0 (compatible; Baiduspider/2.0; http://www.baidu.com/search/spider.html) Accept: */* Accept-Language: zh-CN,zh;q0.9 Connectio…

无人机螺旋桨平衡标准

螺旋桨平衡是确保无人机(UAV)平稳运行、可靠性和使用寿命的关键过程。螺旋桨的不平衡会导致振动、噪音&#xff0c;并加速关键部件的磨损&#xff0c;从而对飞行性能产生负面影响。 ISO 21940-11:2016标准为旋翼平衡提供了一个广泛引用的框架&#xff0c;定义了可接受的不平衡…

既生瑜何生亮?Nginx RTMP 模块与 SRS RTMP服务器技术对比

在实时视频流的场景中&#xff0c;RTMP 协议作为一种传统且高效的流媒体传输协议&#xff0c;广泛应用于各类直播和点播系统。两款流行的开源 RTMP 服务器分别是基于 Nginx 的 Nginx RTMP 模块 和 SRS&#xff08;Simple Real-Time Server&#xff09;。这两者都在流媒体行业有…

MATLAB 批量移动 TIF 文件至分类文件夹

文章目录 前言一、步骤二、代码 前言 本代码用于从指定的源文件夹 (sourceFolder) 中筛选所有 .tif 文件&#xff0c;并根据文件名的特定关键词&#xff08;Daynight 和 FDI&#xff09;将其分类移动到相应的目标文件夹 (targetDaynightFolder 和 targetFDIFolder)。 一、步骤…

重温Ubuntu 24.04 LTS

用户调整 # 创建新用户 sudo adduser newusername # 设置新用户的密码 sudo passwd newusername # 将新用户添加到 sudo 组 sudo usermod -aG sudo newusername # 修改ssh访问权限 sudo nano /etc/ssh/sshd_config # 将新用户加入&#xff0c;此时root将无法访问 AllowUsers n…

AWS Lambda 集成更新详解:打造无缝云函数体验

引言 AWS Lambda 作为一种无服务器计算服务,让开发者能够运行代码而无需配置或管理服务器。随着 AWS 不断优化其服务,Lambda 的集成方式也在不断更新和改进。本文将深入探讨 Lambda 的最新集成选项,帮助您充分利用这一强大的无服务器计算平台。 Lambda 集成类型概述 从图…

基于Kubernetes部署Prometheus监控平台

#作者&#xff1a;stackofumbrella 文章目录 prometheus和k8s集群版本对照表架构Prometheus Operator简介kube-prometheus下载地址 安装修改镜像地址修改Prometheus的service修改Grafana的service修改Alertmanager的service数据持久化执行安装 Prometheus验证Grafana验证解决C…

Android之uCrop (裁剪) 的基本使用资料

Android 拍照、选择图片并裁剪 uCrop裁剪 uCrop裁剪2 uCrop裁剪3 1.权限检查 private static final int REQUEST_CAMERA_PERMISSION 333; private void requestCameraPermission() {if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA)! …

STM32基础教程——输入捕获模式测量PWM频率

目录 前言 技术实现 原理图 连线图 代码实现 内容要点 PWM基本结构 开启外设时钟 配置GPIO端口 配置时基单元 初始化输出比较单元 输出比较通道重映射 输入捕获功能初始化 计算捕获PWM的频率 实验结果 问题记录 前言 IC&#xff08;Input Capture&#xff09;输…

基于网启PXE服务器的批量定制系统平台(详细版)

项目说明 该项目共分为2个子项目&#xff0c;由iventoy和定制安装两部分组成 该项目旨在复习巩固系统服务部署使用、shell编程等知识&#xff0c;旨在让学生增加知识面&#xff0c;提高项目实习经历&#xff0c;充实简历 项目背景&#xff1a; 公司新购了一批服务器和台式机…