【算法】冒泡排序算法原理及实现

news2024/11/17 10:01:20

1.什么是冒泡排序

  • 冒泡排序(Bubble Sort),它是一种最为基础的交换排序。之所以叫冒泡排序,是因为这一种排序算法的每一个元素可以根据自身的大小,一点点的向着一侧来移动。
  • 每一轮都会找到一个最大的数字冒泡到数组数组末尾来完成 排序。

2.冒泡排序图解

  • 有7个数组组成的无序数列 :1,2,6,4,3,7,5 希望从小到大排。按照冒泡排序的思想,只需要相邻的两个元素进行比较,再根据它的大小来交换元素位置;

在这里插入图片描述

  • 排序过程
    • 首先先比较1和2发现1没有2大,不做操作,元素位置不变
    • 2和6也是一样,元素位置不变
    • 6和4比较,发现6比4大,6和4两个元素交换位置,变成 4 6
    • 然后在用6和3比较,6和3两个元素交换位置,变成 3 6
    • 然后6和7比较,不做操作,元素位置不变
    • 然后7和3比较,7和3两个元素交换位置,变成 3 7,这样第一轮就结束了,确保这一轮最大的已经放在队尾了

在这里插入图片描述在这里插入图片描述

  • 后面的操作以此类推,每次循环都确定一个最大的队尾,直至到第一个元素。

  • 原始的冒泡排序是最稳定的,但是这个算法每一轮都需要遍历一次所有的元素,所以它的轮转次数和数量是相当的,时间复杂度为O(n^2)。

3.冒泡排序编码实现

(1)整体代码实现

public class BubbleSort {

    public static void main(String[] args) {
        int[] arr = {1,2,6,4,3,7,5};
        System.out.println("排序前:");
        System.out.println(Arrays.toString(arr));
        bubbleSort(arr);
        System.out.println("排序后:");
        System.out.println(Arrays.toString(arr));
    }

    public static void bubbleSort(int[] arr){
        //从一个元素遍历到arr.length-1个
        // 注意不能是到arr.length 因为只需要找到倒数第二个和最后一个比较就行了
        //每次都会找到下一个元素进行比较,所以如果是arr.length 的话汇报数组越界异常
        for (int i = 0; i < arr.length-1; i++) {
            //内层循环每次确定最后一个元素,所以是arr.length-1-i
            for (int j = 0; j < arr.length-1-i; j++) {
                if(arr[j]>arr[j+1]){
                    //做元素交换
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
    }
}

(2)测试结果

在这里插入图片描述

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

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

相关文章

一文探索预训练的奥秘

2022年下半年开始&#xff0c;涌现出一大批大模型的应用&#xff0c;其中比较出圈的当属AI作画与ChatGPT&#xff0c;刷爆了各类社交平台&#xff0c;其让人惊艳的效果&#xff0c;让AI以一个鲜明的姿态**&#xff0c;站到了广大民众面前&#xff0c;让不懂AI的人也能直观地体会…

一刷代码随想录——哈希表

1 理论基础常见的三种哈希结构当我们想使用哈希法来解决问题的时候&#xff0c;我们一般会选择如下三种数据结构。数组set &#xff08;集合&#xff09;map(映射)这里数组就没啥可说的了&#xff0c;我们来看一下set。在C中&#xff0c;set 和 map 分别提供以下三种数据结构&a…

Node.js+Vue.js全栈开发王者荣耀手机端官网和管理后台(三) | 前台页面part

文章目录工具样式概念和SASS样式重置网站色彩和字体定义&#xff08;colors text&#xff09;通用flex布局样式定义常用边距定义&#xff08;margin padding&#xff09;主页框架和顶部菜单首页顶部轮播图片&#xff08;vue swiper&#xff09;使用精灵图片&#xff08;sprite&…

【ThreeJs 初学习】基本API的使用方式

基本API的使用方式 根据官网的文档整理出一份API文档, 地址是&#xff1a;ThreeJs 官网文档&#xff0c;其目的还是为了方便查阅 下列代码源码地址 // 此处表示导入three import * as THREE from three;// 1. 创建一个场景 const scene new THREE.Scene();// 2. 创建一个相机…

文献阅读:Language Models are Unsupervised Multitask Learners

文献阅读&#xff1a;Language Models are Unsupervised Multitask Learners 1. 内容介绍2. 模型介绍3. 实验结果 1. 语言模型2. QA & 常识推断3. 生成任务 4. 总结 & 思考 文献链接&#xff1a;https://cdn.openai.com/better-language-models/language_models_are_u…

python-布隆过滤器

在学习redis过程中提到一个缓存穿透的问题&#xff0c; 书中参考的解决方案之一是使用布隆过滤器&#xff0c; 那么就有必要来了解一下什么是布隆过滤器。在参考了许多博客之后&#xff0c; 写个总结记录一下。 一、布隆过滤器简介 什么是布隆过滤器&#xff1f; 本质上布隆…

橘子学docker01之基本玩法

docker docker镜像集成了最核心需要得环境&#xff0c;所以占空间小&#xff0c;运行快&#xff0c;启动秒级。 docker的几个概念&#xff1a; 注册中心&#xff1a;相当于超级码头&#xff0c;上面放的就是集装箱。 镜像&#xff08;image&#xff09;&#xff1a;集装箱,好比…

Spring Boot学习之Dubbo+Zookeeper初识

文章目录一 分布式理论基础知识1.1 单一应用架构1.2 垂直应用架构1.3 分布式服务架构1.4 流动计算架构1.5 PRC[Remote Procedure Call]二 Dubbo2.1 Dubbo简介三 Dubbo环境搭建3.1 Zookeeper简介3.2 Zookeeper下载与安装3.3 解决问题3.3.1 错误一的分析和解决3.3.2 错误二的分析…

JavaEE day8 初识HTTP

HTTP协议 HTTP协议&#xff0c;又称超文本传输协议&#xff0c;是一种应用广泛的应用层协议。所谓超文本&#xff0c;其实就是除了文本还能传输其他资源。而HTTP本身是基于传输层的TCP协议实现的。目前HTTP协议3版本已经在完善中。本文采用1.1版本。 它是一种请求--响应的工作…

MyBatis 持久层框架详细解读:Mapper代理开发

文章目录1. 前言2. Mapper 代理开发3. 过程剖析4. 总结1. 前言 前面在 MyBatis 快速入门篇中&#xff0c;我们使用了 MyBatis 原生的开发方式操作数据库&#xff0c;解决了 JDBC 操作数据库时的硬编码和操作繁琐的问题。实际上&#xff0c;在 Java 项目中&#xff0c;我们更常…

MVC和MVVM的区别

一、MVC mvc&#xff1a;是一种代码架构设计模式&#xff0c;前端中的mvc最主要的作用就是将视图和数据模型进行分离 &#xff08;1&#xff09; 为什么需要 MVC 简单理解&#xff1a;也就是为什么需要将视图和数据模型进行分离 <select id"drinkSelect">&…

宕机后,如何避免 Redis 的数据丢失?

前言 如果有人问你&#xff1a;"你会把 Redis 用在什么业务场景下&#xff1f;" 我想你大概率会说&#xff1a;"我会把它当作缓存使用&#xff0c;因为它把后端数据库中的数据存储在内存中&#xff0c;然后直接从内存中读取数据&#xff0c;响应速度会非常快。…

Lua 文件I/O

Lua 文件I/O 参考至菜鸟教程。 Lua I/O 库用于读取和处理文件。分为简单模式&#xff08;和C一样&#xff09;、完全模式。 简单模式&#xff08;simple model&#xff09;拥有一个当前输入文件和一个当前输出文件&#xff0c;并且提供针对这些文件相关的操作。完全模式&#…

C++Primer13.6.2节练习

练习13.49&#xff1a; StrVec类的移动构造函数和移动赋值运算符 //移动构造函数 StrVec::StrVec(StrVec&& s)noexcept :elements(s.elements), first_free(s.first_free), cap(s.cap) {//令移后源对象进入状态-----对其运行析构函数是安全的s.elements s.first_fre…

关于网络编程

Socket套接字Socket API是网络编程最核心的部分。Socket套接字是由系统提供用于网络通信的技术&#xff0c;是基于TCP/IP协议的网络通信的基本操作单元。基于Socket套接字的网络程序开发就是网络编程。Socket API与传输层密切相关&#xff0c;由于传输层有UDP和TCP两种协议类型…

使用Idea中将单个java类打包成jar包

开工第一天&#xff0c;正在暗自爽&#xff0c;领导让帮个忙&#xff0c;给一个工具类打成jar包&#xff0c;供其他项目组使用&#xff0c;这就开始了尝试。 其实网上已经有好多人写过了&#xff0c;只是尝试了几篇&#xff0c;坑得不轻&#xff0c;自己做下笔记&#xff0c;留…

表格控件Aspose.Cells for .NET 授权须知

支持的平台 Aspose.Cells 可作为 .NET、Java、C 和 Python 的四种不同产品使用&#xff0c; .NET Framework.NET Standard 2.0Xamarin.AndroidXamarin.iOSXamarin.MacCOMMonoWindows Azure Aspose.Cells 下载&#xff08;qun&#xff1a;761297826&#xff09;https://www.ev…

python 高阶函数

传入函数 要理解“函数本身也可以作为参数传入”&#xff0c;可以从Python内建的map/reduce函数入手。 我们先看map。map()函数接收两个参数&#xff0c;一个是函数&#xff0c;一个是序列&#xff0c;map将传入的函数依次作用到序列的每个元素&#xff0c;并把结果作为新的l…

Java:基于注解的Spring使用【AOP容器】和事务管理

目录 第十五章 AOP前奏15.1 代理模式15.2 为什么需要代理【程序中】15.3 手动实现动态代理环境搭建15.4 手动实现动态代理关键步骤第十六章 Spring中AOP【重点】16.1 AspectJ框架【AOP框架】16.2 使用AspectJ步骤&#xff08;入门&#xff09;16.3 Spring中AOP概述16.4 Spring中…

AMQP 0-9-1 模型解释

官方文档链接&#xff1a;https://www.rabbitmq.com/tutorials/amqp-concepts.html 文章目录1. AMQP协议是什么2. AMQP模型2.1 工作过程2.2 深入理解3. 交换机3.1 默认交换机3.2 直连交换机3.3 扇形交换机3.4 主题交换机3.5 头交换机3.6 交换机小结4. Queue队列队列属性队列创建…