冒泡排序实现原理

文章目录

  • 前言
  • 一、算法原理
  • 二、复杂度
  • 三、Java实现
  • 总结

前言

冒泡排序(Bubble Sort),是一种比较简单的排序算法。

它重复地走访要排序的元素列,依次比较两个相邻的元素,如果它们的顺序错误,则把它们交换位置。走访元素重复地进行,直到没有相邻元素需要交换为止,完成整个排序过程。

一、算法原理

  • 比较相邻元素,如果元素1大于元素2,则交换。
  • 依次向后对每一个相邻元素做同样的工作,直到队列末尾,这时最大的元素就位于最后一个元素位置了。
  • 重复以上步骤,直到最后一个元素位置的前一位为止(因为最后一位已经排好了)。
  • 持续每次对越来越少的元素重复上面步骤,直到没有任何一个数字需要比较位置,排序结束。

二、复杂度

如果数组的初始状态是正序的,一趟扫描即可完成排序,所以,冒泡排序最好的时间复杂度为O(n)。冒泡排序的最坏时间复杂度为O(n²),冒泡排序总的平均时间复杂度为O(n²)。

由于冒泡排序是原址排序,所以空间复杂度为O(1)。

三、Java实现

基础标准版本:

public void bubbleSort(int[] arr){int i,j,t;int l = arr.length;fow(i=0;i<l-1;i++){for(j=0;j<l-i-1;j++){if(arr[j]>arr[j+1]){t = arr[j];arr[j] = arr[j+1];arr[j+1] = t;}}}
}

冒泡排序就是把小的元素往前调,或者把大的元素往后调。相邻元素之间进行比较,交换也发生在这两个元素之间,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

优化版本

冒泡排序可以有以下改进:

执行完一轮排序后,虽然可能数据已全部排序完毕,但程序无法判断是否完成。为此,我们可以设置一个标志位:flag,用它来表示是否是乱序状态,每经过一轮排序之前,我们都会设置flag状态为false,如果本轮排序发生了元素位置交换,则表示为乱序状态,修改flag值为true,但如果已经是顺序的,则不会发生元素交换,表示已排序完毕,终止排序即可。

public void bubbleSort(int[] arr){int i,j,t;int l = arr.length;boolean flag = true;for(i=0;i<l-1;i++){flag = false;for(j=0;j<l-i-1;j++){if(arr[j]>arr[j+1]){t = arr[j];arr[j] = arr[j+1];arr[j+1] = t;flag = true;}}if(!flag){//提前终止排序,避免了性能浪费break;}}
}

总结

本文介绍了一种非常简单的排序方法——冒泡排序。

  • 冒泡排序就是把小的元素往前调,或者把大的元素往后调,交换发生在相邻的两个元素之间,走访元素重复地进行,直到没有相邻元素需要交换为止,完成整个排序过程。
  • 相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。
  • 冒泡排序最好的时间复杂度为O(n)。冒泡排序的最坏时间复杂度为O(n²),冒泡排序总的平均时间复杂度为O(n²)。
  • 冒泡排序是原址排序,所以空间复杂度为O(1)。
  • 我们可以设置一个标志位:flag,用它来表示是否是乱序状态,每经过一轮排序之前,我们都会设置flag状态为false,如果本轮排序发生了元素位置交换,则表示为乱序状态,修改flag值为true,但如果已经是顺序的,则不会发生元素交换,表示已排序完毕,终止排序即可。

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

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

相关文章

macOS Monterey 12.6.8 (21G725) 正式版发布,ISO、IPSW、PKG 下载

macOS Monterey 12.6.8 (21G725) 正式版发布&#xff0c;ISO、IPSW、PKG 下载 本站下载的 macOS 软件包&#xff0c;既可以拖拽到 Applications&#xff08;应用程序&#xff09;下直接安装&#xff0c;也可以制作启动 U 盘安装&#xff0c;或者在虚拟机中启动安装。另外也支持…

C++运算符:优先级

#include <iostream> using namespace std;//#define INT int //宏命令 // typedef int BOO; //移动 // INT a10; // BOO b 12;void fun(string& str) {int pos str.find(a);cout << "位置" << pos << endl;str.replace(pos,…

Windows Active Directory密码同步

大多数 IT 环境中&#xff0c;员工需要记住其默认 Windows Active Directory &#xff08;AD&#xff09; 帐户以外的帐户的单独凭据&#xff0c;最重要的是&#xff0c;每个密码还受不同的密码策略和到期日期的约束&#xff0c;为不同的帐户使用单独的密码会增加用户忘记密码和…

微信小程序弱网监控

前言 在真实的项目中&#xff0c;我们为了良好的用户体验&#xff0c;会根据用户当前的网络状态提供最优的资源&#xff0c;例如图片或视频等比较大的资源&#xff0c;当网络较差时&#xff0c;可以提供分辨率更低的资源&#xff0c;能够让用户尽可能快的看到有效信息&#xf…

Spring MVC -- 获取参数(普通对象+JSON对象+URL地址参数+文件+Cookie/Session/Header)

目录 1.获取参数 1.1获取单个参数 1.2获取多个参数 传参注意事项&#xff1a; 2.获取对象 3.后端参数重命名RequestParam 4.获取JSON对象RequestBody 5.从 URL 地址中获取参数 PathVariable 6.上传文件 RequestPart 7.获取Cookie/Session/Header 7.1 获取 Request 和…

【MySQL】MySQL索引、事务、用户管理

20岁的男生穷困潦倒&#xff0c;20岁的女生风华正茂&#xff0c;没有人会一直风华正茂&#xff0c;也没有人会一直穷困潦倒… 文章目录 一、MySQL索引特性&#xff08;重点&#xff09;1.磁盘、OS、MySQL&#xff0c;在进行数据IO时三者的关系2.索引的理解3.聚簇索引&#xff0…

安全杂记 - 状态码,DNS,编码

目录 1.状态码2.DNS解析过程3.URL编码4.HTML实体编码5.FORM表单 1.状态码 200 - 请求成功 301 - 资源&#xff08;网页等&#xff09;被永久转移到其它URL 302 - 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI 304 - 未修改。所请求的资源未修改&#…

WebSocket工具类

最近的项目在整长连接WebSocket&#xff0c;之前也写过一个感觉没有这个全面。提供个工具类WebSocketHelper和Java-WebSocket-1.3.9.jar包以及一个HttpURLConnectionUtil 1、WebSocketHelper import android.util.Log;import org.java_websocket.client.WebSocketClient; imp…

Two Days wpf 分享 分页组件

迟来的wpf分享。 目录 一、序言 二、前期准备 三、前端界面 四、后台代码部分 1、先定义些变量后面使用 2、先是按钮事件代码。 首页按钮 上一页按钮 下一页按钮 末尾按钮 画每页显示等数据 每页显示多少条 判断是否为数字的事件 分页数字的点击触发事件 跳转到…

HCIP——OSPF基础

OSPF基础 一、OSPF基础二、OSPF的区域划分三、OSPF的数据包hello包数据库描述包DBD包链路状态请求包LSR包链路状态更新包LSU包链路状态确认包LSAck包 四、OSPF的状态机五、OSPF的工作过程六、链路状态型的路由生成过程七、条件匹配五、OSPF数据包头部八、OSPF的接口网络类型 一…

链动2+1系统开发模式有没有风险?

现在的分销模式层出不穷&#xff0c;很多人都不知道分销与传销的区别&#xff0c;甚至认为最近很火的一个分销模式链动21也是个传销盘。那么&#xff0c;链动21模式究竟涉不涉传&#xff1f;有没有风险呢&#xff1f;下面就来具体说一下。 首先分销不是传销&#xff0c;分销是商…

Kafka生产者性能调优技巧

Kafka生产者性能调优技巧 一、Kafka生产者简介1.1 概述1.2 Kafka生产者性能的重要性1.2.1 批量发送消息1.2.2 指定分区1.2.3 使用压缩算法1.2.4 合理设置ACKs参数 二、Kafka生产者性能调优技巧2.1 硬件配置优化2.1.1 CPU、内存、磁盘等硬件参数调整注意事项2.1.2 如何通过负载均…

(css)列表点击前后样式

(css)列表点击前后样式 效果&#xff1a; html <ul v-show"rightOne" class"one-content"><liv-for"(item,index) in exampleList":key"index"click"searchHandle(item,index)"class"liClass":class&qu…

Java中的LRU缓存算法

Java中的LRU缓存算法 LRU&#xff08;Least Recently Used&#xff09;缓存算法是一种常见的缓存淘汰算法&#xff0c;用于在缓存空间不足时决定哪些数据需要被淘汰&#xff0c;以便为新的数据腾出空间。LRU算法的基本思想是&#xff1a;当缓存满时&#xff0c;淘汰最近最少使…

MySQL函数讲解(谓词、CASE)

目录 MySQL常见函数 字符串函数 进行字符串操作的函数 算术函数 进行数值计算的函数 日期函数 进行日期操作的函数 转换函数 进行数据类型和值转换的函数 流程函数 进行条件删选 聚合函数 进行数据聚合的函数 谓词 一般用于条件判断 什么是函数 函数指一段可以直接被…

第5集丨ES6 江湖 —— 函数扩展

目录 一、箭头函数1.1 基本用法1.2 与变量解构结合使用1.3 表达更加简洁1.4 rest 参数与箭头函数结合1.5 注意点1.6 this对象1.6.1 利于封装回调函数1.6.2 练习 1.7 arguments 、 super、 new.target1.8 call() 、 apply() 、 bind() 二、rest 参数2.1 rest 参数代替 arguments…

git常用命令总结

文章目录 1. 创建仓库和初始化2. 添加和提交更改3. 分支管理4. 查看状态和历史5. 撤销更改6. 远程仓库 当使用 Git 进行版本控制时&#xff0c;以下是一些常用的 Git 命令的详细总结&#xff1a; 1. 创建仓库和初始化 git init: 在当前目录创建一个新的 Git 仓库。执行后会在当…

【C++】-多态的语法细节详解

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

android 高版本sd卡目录读写权限

1、从安卓11不允许访问sd目录&#xff0c;官方说明如下&#xff1a; https://developer.android.com/about/versions/11/privacy/storage?hlzh-cn 2、使用MediaStore方法 一手遮天 Android - 存储: Android 11 通过 MediaStore 管理文件 - webabcd - 博客园 (cnblogs.com) …

GPT-3.5:ChatGPT的奇妙之处和革命性进步

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…