冒泡排序及其优化

前言

本文将简单介绍冒泡排序及其优化版本,默认从小到大顺序

什么是冒泡排序

冒泡排序是一种简单且经典的排序算法。
基本思想: 是通过反复交换相邻的未按顺序排列的元素,将最小(或最大)的元素逐渐“浮”到正确位置。
时间复杂度: O(n^2)
排序稳定性: 稳定

说大白话就是两个位置判断是否符合小到大(大到小)顺序,不符合则交换,符合则下一轮,图例(一轮):
在这里插入图片描述

就上图所示,我们的数组{4,2,7,1,5},在交换排序这个过程中,需要两个指针进行辅助排序,两个指针是同时移动的,每移动一位就比较一次,这样就能将大的值往后放,小的值往前放,这样一轮下来,大的数是一定在被排序到数组往后位置的

既然一轮只能对部分数据进行排序,那么我们只需要多重复几次操作就可以了,次数 = arr.length - 1(2个数排序最多比较只需要1次,3个数排序最多比较需要2次)

public class BubbleSorted {public static void main(String[] args) {int[] arr = new int[]{4,2,7,1,5};for(int i = 0; i < arr.length-1; i++){for(int j = 0; j < arr.length - 1; j++){if(arr[j] > arr[j+1]){swap(arr, j, j+1);}}}for (int i : arr) {System.out.println(i+" ");}}private static void swap(int[] arr, int i, int j) {arr[i] = arr[i] ^ arr[j];arr[j] = arr[i] ^ arr[j];arr[i] = arr[i] ^ arr[j];}
}

优化一

对于上面的这种冒泡排序每两两进行比较不管是否需要,这是一种比较耗时的操作,我们通过代码举个例子:

public class BubbleSorted {public static void main(String[] args) {int[] arr = new int[]{5, 8, 6, 1, 12, 13, 14};for (int i = 0; i < arr.length - 1; i++) {for (int j = 0; j < arr.length  - 1; j++) {if (arr[j] > arr[j + 1]) {swap(arr, j, j + 1);}}System.out.println("第"+(i+1)+"次排序结果:"+Arrays.toString(arr));}}private static void swap(int[] arr, int i, int j) {arr[i] = arr[i] ^ arr[j];arr[j] = arr[i] ^ arr[j];arr[i] = arr[i] ^ arr[j];}
}

运行结果:

第1次排序结果:[5, 6, 1, 8, 12, 13, 14]
第2次排序结果:[5, 1, 6, 8, 12, 13, 14]
第3次排序结果:[1, 5, 6, 8, 12, 13, 14]
第4次排序结果:[1, 5, 6, 8, 12, 13, 14]
第5次排序结果:[1, 5, 6, 8, 12, 13, 14]
第6次排序结果:[1, 5, 6, 8, 12, 13, 14]

我们不难发现,其实后面的456次排序是压根不需要了,因为它原本就是有序的,多余的判断是浪费时间的,那么我们要如何去判断后续已经有序不需要比较呢???

很简单,假如我们在一轮比较中,都没有需要进行交换,那么就意味着后面的顺序都是有序的,也就是说,我们第5次的排序结果可以通过第4次结果推导,如果有序则不再进行剩下的几轮排序,直接break,所以我们设置一个标记位即可,下面代码示例:

public class BubbleSorted {public static void main(String[] args) {int[] arr = new int[]{5, 8, 6, 1, 12, 13, 14};for (int i = 0; i < arr.length - 1; i++) {// 没一轮排序重置标记位,只有进入交换才说明本轮的排序结果可能任然是无序的,//一次交换都没有进行,说明这一轮排序没有一个位置需要比较交换boolean flag = true;for (int j = 0; j < arr.length - 1; j++) {if (arr[j] > arr[j + 1]) {flag = false;swap(arr, j, j + 1);}}System.out.println("第"+(i+1)+"次排序结果:"+Arrays.toString(arr));if(flag){break;}}}private static void swap(int[] arr, int i, int j) {arr[i] = arr[i] ^ arr[j];arr[j] = arr[i] ^ arr[j];arr[i] = arr[i] ^ arr[j];}
}

运行结果:

第1次排序结果:[5, 6, 1, 8, 12, 13, 14]
第2次排序结果:[5, 1, 6, 8, 12, 13, 14]
第3次排序结果:[1, 5, 6, 8, 12, 13, 14]
第4次排序结果:[1, 5, 6, 8, 12, 13, 14]

我们可以发现56轮已经不用再进行了,但是我们还需要第4轮来进行排序判断。

优化二

在优化一后,我们还可以对冒泡排序进行优化

首先,我们可以观察实例的结果,不难发现,每经过一轮排序,数组倒数位置上的数一定是有序的,因为每一轮的比较,大的数一定是往后跑的,那么就意味着,我们之后的比较排序不需要在对他们进行关注,所以我们每排序一次,内循环就少判断一位,以下是代码示例:

public static void main(String[] args) {int[] arr = new int[]{5, 8, 6, 1, 12, 13, 14};for (int i = 0; i < arr.length - 1; i++) {boolean flag = true;// 内循环循环次数每次  -i  for (int j = 0; j < arr.length - i - 1; j++) {if (arr[j] > arr[j + 1]) {flag = false;swap(arr, j, j + 1);}}System.out.println("第"+(i+1)+"次排序结果:"+Arrays.toString(arr));if(flag){break;}}}private static void swap(int[] arr, int i, int j) {arr[i] = arr[i] ^ arr[j];arr[j] = arr[i] ^ arr[j];arr[i] = arr[i] ^ arr[j];}

总结

冒泡排序是一种通过相邻两个数进行比较来进行排序的,可以通过两种优化的结合尽可能的提升效率,但是当数据量大的时候,效率依旧堪忧

以上是本文全部内容,感谢阅读

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

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

相关文章

vscode 下载安装

vscode 下载安装常用插件 vscode 官网&#xff1a; https://code.visualstudio.com/ 点击右上角 Download 进入下载选择页面 选择自己使用操作对应 CPU 架构 下载 本文使用 x86 架构 64位 windows 系统为例 跳转下载页面 自动 开始下载 下载不开始&#xff1f;试试这个直…

lighttpd以及socket和WebSocket编程

综述 本文涉及到下图绿色背景部分的内容&#xff1a; 左侧位于Linux下&#xff0c;其中包括lighttpd和socket程序&#xff1b;右侧是WebSocket程序。两者通过网络交互。 本文介绍lighttpd的基本使用方式&#xff0c;并通过编程完成一个socket服务器与浏览器端的WebSocket客户…

Spring Boot @Value读不到Nacos配置中心的值。(properties配置文件)

读不到配置中心的值&#xff0c; 配置中心的配置文件名字&#xff08;Data ID的值&#xff09;要以.properties结尾。 如果是yaml&#xff0c;就以yaml命名。

Git:Git的一些基本操作

文章目录 基本认识使用方法创建本地仓库配置本地仓库 工作区、暂存区、版本库的概念添加文件版本回退撤销修改删除操作 基本认识 首先要对Git有一个基本的认知&#xff1a; Git本质上是一个版本控制器&#xff0c;可以对一个信息的多个版本进行一些控制&#xff0c;而能对版本…

腾讯mini项目-【指标监控服务重构】2023-08-16

今日已办 v1 验证 StageHandler 在处理消息时是否为单例&#xff0c;【错误尝试】 type StageHandler struct { }func (s StageHandler) Middleware1(h message.HandlerFunc) message.HandlerFunc {return func(msg *message.Message) ([]*message.Message, error) {log.Log…

mac 本地运行 http-proxy-middleware ,请求超时

const http require(http)"/customer": {target: "http://10.10.111.192:8080/",// target: "http://user.jinfu.baohan.com/",changeOrigin: true, // 是否启用跨域// 解决mac 代理超时问题headers: {Connection: "keep-alive"},// …

脚本:python绘制七夕爱心

文章目录 效果脚本Reference 效果 脚本 import random from math import sin, cos, pi, log from tkinter import *CANVAS_WIDTH 640 # 画布的宽 CANVAS_HEIGHT 640 # 画布的高 CANVAS_CENTER_X CANVAS_WIDTH / 2 # 画布中心的X轴坐标 CANVAS_CENTER_Y CANVAS_HEIGHT /…

WebGL 根据模型矩阵的逆转置矩阵计算运动物体的光照效果

目录 前言 坐标变换引起法向量变化 变化规律&#xff1a; 魔法矩阵&#xff1a;逆转置矩阵 逆转置矩阵的用法总结 Matrix4对象的 setInverseOf 、transpose 方法规范&#xff08;以完成逆转置矩阵&#xff09; 示例代码&#xff08;LightedTranslatedRotatedCube.js&am…

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— JS基础(二)

人生是旷野&#xff0c;不是轨道。 思维导图 一、运算符 1.1 赋值运算符 1.2 一元运算符 1.3 比较运算符 1.4 逻辑运算符 逻辑与&#xff0c;一假则假 逻辑或&#xff0c;一真则真 <!DOCTYPE html> <html lang"en"><head><meta charset&quo…

win10远程桌面控制Ubuntu服务器 - 内网穿透实现公网远程

文章目录 前言视频教程1. ubuntu安装XRDP2.局域网测试连接3. Ubuntu安装cpolar内网穿透4.cpolar公网地址测试访问5.固定域名公网地址 转载自cpolar极点云文章&#xff1a;树莓派使用Nginx 搭建轻量级网站远程访问 前言 XRDP是一种开源工具&#xff0c;它允许用户通过Windows R…

【力扣周赛】第 362 场周赛(⭐差分匹配状态压缩DP矩阵快速幂优化DPKMP)

文章目录 竞赛链接Q1&#xff1a;2848. 与车相交的点解法1——排序后枚举解法2——差分数组⭐差分数组相关题目列表&#x1f4d5;1094. 拼车1109. 航班预订统计2381. 字母移位 II2406. 将区间分为最少组数解法1——排序贪心优先队列解法2——差分数组 2772. 使数组中的所有元素…

Java 高频疑难问题系列一

​​​​​​​ 目录 ​编辑​​​​​​​ 1.零长度 2.redis的有序集的排序 3.Unsafe类 4.带资源的try语句 5.Spring如何实现计划任务 6.Java中普通代码块,构造代码块,静态代码块执行顺序 7.MyBatis缓存机制 8.Redis Java 2种类型操作转换 9.CAS底层原理和问题 1…

无涯教程-JavaScript - AGGREGATE函数

描述 返回列表或数据库中的聚合。 AGGREGATE函数可以将不同的聚合函数应用于列表或数据库,并且可以选择忽略隐藏的行和错误值。 AGGREGATE函数具有两种不同的格式- 参考格式数组格式 参考格式 语法 AGGREGATE (function_num, options, ref1, [ref2] …)争论 Argument描述…

【学习笔记】Java 一对一培训(2.1)Java基础语法

【学习笔记】Java 一对一培训&#xff08;2.1&#xff09;Java基础语法 关键词&#xff1a;Java、Spring Boot、Idea、数据库、一对一、培训、教学本文主要内容含Java简介、Java基础语法、Java对象和类、Java基本数据类型、Java变量类型、Java修饰符计划2小时完成&#xff0c;…

机器学习:PCA(Principal Component Analysis主成分)降维

参考&#xff1a;PCA降维原理 操作步骤与优缺点_TranSad的博客-CSDN博客 PCA降维算法_偶尔努力翻身的咸鱼的博客-CSDN博客 需要提前了解的数学知识&#xff1a; 一、PCA的主要思想 PCA&#xff0c;即主成分分析方法&#xff0c;是一种使用最广泛的数据降维算法。PCA的主要思想…

【计算机视觉】Vision and Language Pre-Trained Models算法介绍合集(一)

文章目录 一、ALIGN二、Contrastive Language-Image Pre-training&#xff08;CLIP&#xff09;三、Learning Cross-Modality Encoder Representations from Transformers&#xff08;LXMERT&#xff09;四、BLIP: Bootstrapping Language-Image Pre-training五、Vision-and-La…

带你进入桌面数控机床金工实训室

桌面型数控车床实训室 你知道中国哪所大学金工实训室拥有多的小型数控机床吗&#xff1f;答案是安徽工程大学。其国际工程师学院里面建了一栋新楼&#xff0c;专门分配了4个独立的房间作为实训室&#xff0c;占地300平方米&#xff0c;分别配置了小型数控车床&#xff0c;小型…

ES6中新增加的Symbol数据类型及其使用场景

聚沙成塔每天进步一点点 ⭐ 专栏简介在这里插入图片描述 ⭐ ES6中的Symbol数据类型⭐ 对象属性名称⭐ 防止属性冲突⭐ 内置Symbols⭐ 迭代器和生成器⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航…

chatgpt综述和报告

ChatGPT究竟强在哪&#xff1f;复旦大学邱锡鹏教授《大型语言模型的能力分析与应用》_哔哩哔哩_bilibili2022年底&#xff0c;美国OpenA1公司发布了ChatGPT&#xff0c;一个可以与人类对话交互的千亿规模参数的大型语言模型。它可以根据用户输入的指令完成各种语言相关的任务&a…

电商API的应用价值:淘宝1688京东API接口系列

API接口是一种软件应用程序&#xff0c;它充当两个不同软件应用程序之间的中介。它帮助不同的应用程序相互通信&#xff0c;共享数据&#xff0c;从而使用户能够完成不同的任务。API接口的用途非常广泛&#xff0c;下面是一些常见的用途&#xff1a; 数据共享&#xff1a;API接…