排序 - 冒泡排序(Bubble Sort)

news2024/12/23 1:29:32

文章目录

  • 冒泡排序介绍
  • 冒泡排序实现
  • 复杂度和稳定性
    • 冒泡排序时间复杂度
    • 冒泡排序稳定性
  • 代码实现
  • 核心&注意
  • 结尾

每日一道算法提高脑力,今天是第一天,来个最简单的算法–冒泡排序。

冒泡排序介绍

它是一种较简单的排序算法。它会遍历若干次要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小;如果前者比后者大,则交换它们的位置。这样,一次遍历之后,最大的元素就在数列的末尾! 采用相同的方法再次遍历时,第二大的元素就被排列在最大元素之前。重复此操作,直到整个数列都有序为止!

冒泡排序实现

下面以数列{20,40,30,10,60,50}为例,演示它的冒泡排序过程(如下图)。

在这里插入图片描述

我们先分析第1趟排序

  • 当i=5,j=0时,a[0]<a[1]。此时,不做任何处理!
  • 当i=5,j=1时,a[1]>a[2]。此时,交换a[1]和a[2]的值;交换之后,a[1]=30,a[2]=40。
  • 当i=5,j=2时,a[2]>a[3]。此时,交换a[2]和a[3]的值;交换之后,a[2]=10,a[3]=40。
  • 当i=5,j=3时,a[3]<a[4]。此时,不做任何处理!
  • 当i=5,j=4时,a[4]>a[5]。此时,交换a[4]和a[5]的值;交换之后,a[4]=50,a[3]=60。

于是,第1趟排序完之后,数列{20,40,30,10,60,50}变成了{20,30,10,40,50,60}。此时,数列末尾的值最大。

根据这种方法:

  • 第2趟排序完之后,数列中a[5…6]是有序的。
  • 第3趟排序完之后,数列中a[4…6]是有序的。
  • 第4趟排序完之后,数列中a[3…6]是有序的。
  • 第5趟排序完之后,数列中a[1…6]是有序的。整个数列也就是有序的了。

复杂度和稳定性

冒泡排序时间复杂度

冒泡排序的时间复杂度是O(N2)。 假设被排序的数列中有N个数。遍历一趟的时间复杂度是O(N),需要遍历多少次呢? N-1次!因此,冒泡排序的时间复杂度是O(N2)。

冒泡排序稳定性

冒泡排序是稳定的算法,它满足稳定算法的定义。 算法稳定性 – 假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的!

代码实现


package com.zxn.test;

/**
 * @author zxn
 * @ClassName BubbleSort
 * @Description
 * @createTime 2023年04月24日 01:01:00
 */
public class BubbleSort {
    public static void main(String[] args) {
        int[] a ={30,22,13,4,5,6,7,8,1};
        bubbleSort1(a);
    }

   // 1.0版本
    public static void bubbleSort1(int[] a) {
        int a1,a2;
        for (int i = a.length-1; i >1 ; i--) {
            for (int j = 0; j < i; j++) {
                 a1 = a[j];
                 a2 = a[j + 1];
                 if (a2>a1){
                     int temp = a2;
                     a2 = a1;
                     a1 = temp;
                 }

            }
        }
    }

    // 2.0版本
    public static void bubbleSort2(int[] a) {
        boolean flag =false;
        int a1,a2;
        for (int i = a.length-1; i >1 ; i--) {
            for (int j = 0; j < i; j++) {
                a1 = a[j];
                a2 = a[j + 1];
                if (a2>a1){
                    int temp = a2;
                    a2 = a1;
                    a1 = temp;
                    flag = true;
                }

            }
            if (!flag){
                break;
            }
        }
    }
}

核心&注意

该算法是稳定的
因为只有大于才会互换位置,所以该算法是稳定的。

冒泡算法的核心在于将大的数放在数组后面,使数据呈现一个正序排布。
所以循环分两层,外层从数组最后一位开始,内层从数组第一位开始,内层下标不可以大于外层下标。

注意一个细节就是第一次遍历时如果没有位置的变化说明本身就是正序的,无需再进行遍历。
所以需要一个变量记录第一次遍历时是否有位置变化。

结尾

开篇先来个最基础的算法。以后每日一道,共勉!!!

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

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

相关文章

对话庄表伟老师-文字实录

我内心有一套价值观&#xff0c;有一套世界观&#xff0c;它是一个完整的整体&#xff0c;无论我做任何的事情&#xff0c;工作也好、生活也好、学习也好、去做社区也好、或者是结识朋友也好、去聊天也好&#xff0c;背后的价值观在内心都是一整套的&#xff0c;互相之间是不会…

Python学习之简易图片浏览器

俗话说实践是学习最有效的方法。最近在学习python&#xff0c;于是就参考着各类文章&#xff0c;也倒腾了一个简易图片浏览器&#xff0c;效果图如下&#xff1a; 整个浏览器分为左右两侧&#xff0c;左侧是地址栏图片文件列表&#xff1b;右侧则是图片显示区域。 左侧地址栏有…

数据结构,二叉搜索树的详解

&#x1f9d1;‍&#x1f4bb;作者&#xff1a;程序猿爱打拳&#xff0c;Java领域新星创作者&#xff0c;阿里云社区博客专家。 &#x1f5c3;️文章收录于&#xff1a;数据结构与算法 &#x1f5c2;️JavaSE的学习&#xff1a;JavaSE &#x1f5c2;️MySQL数据库的学习: MySQL…

Python基础之类

一&#xff1a;什么是类 类即类别/种类&#xff0c;是面向对象分析和设计的基石&#xff0c;如果多个对象有相似的数据与功能&#xff0c;那么该多个对象就属于同一种类。有了类的好处是&#xff1a;我们可以把同一类对象相同的数据与功能存放到类里&#xff0c;而无需每个对象…

【AI绘画】Midjourney的使用及程序示例

Midjourney 1.背景2.Midjourney的原理3.Midjourney的使用方法4.Midjourney的示例代码 1.背景 Midjourney 是一款基于深度学习的图像转换工具&#xff0c;其可以将一张图像转换成具有不同风格的图像&#xff0c;例如将一张照片转换成卡通风格的图像。Midjourney 基于 TensorFlow…

Jetson Nano一步到位打开USB摄像头(Rosmaster小车)

背景&#xff1a;我用的rosmaster r2小车配的摄像头是Astra pro&#xff0c;也就是下图这款&#xff1a; 1. 支持的摄像头 Jetson开发包有多个用于连接相机的接口&#xff0c;包括USB、以太网和MIPI CSI-2。流行的相机是现成的支持&#xff0c;而Jetson生态系统合作伙伴支持广…

基于树莓派的OpenEuler基础实验二

文章目录 基于树莓派的OpenEuler基础实验二一、ROS中间件介绍1. ROS话题通信与服务通信2. 常见的ROS终端命令 二、中间件基础实验1. ROS的移植2. ROS的安装和环境配置3. 第一个ROS实践之开启小海龟4. ROS话题实践1&#xff09;ROS工作区与软件包的创建2&#xff09;ROS的话题通…

可能是最强的Python可视化神器,建议一试

数据分析离不开数据可视化&#xff0c;我们最常用的就是Pandas&#xff0c;Matplotlib&#xff0c;Pyecharts当然还有Tableau&#xff0c;看到一篇文章介绍Plotly制图后我也跃跃欲试&#xff0c;查看了相关资料开始尝试用它制图。 Plotly Plotly是一款用来做数据分析和可视化的…

《商用密码应用与安全性评估》第二章政策法规2.4商用密码应用安全性评估工作

商用密码应用安全性评估体系发展历程 第一阶段&#xff1a;制度奠基期&#xff08;2007年11月至2016年8月&#xff09; 第二阶段&#xff1a;再次集结期&#xff08;2016年9月至2017年4月&#xff09; 第三阶段&#xff1a;体系建设期&#xff08;2017年5月至2017年9月&…

【Vue3】vue3中的watchEffect使用及其他的API

目录 一&#xff0c;watchEffect 二&#xff0c;生命周期 三&#xff0c;什么是hooks? 四&#xff0c;toRef 五&#xff0c;其他组合式API 5.1shallowReactive&shallowRef 5.2readonly&shallowReadonly 5.3.toRaw&markRaw 5.4自定义Ref-customRef ​5.5pr…

SSM框架整合之单表操作

1、Spring和Spring MVC父子容器 概念介绍 1.在Spring与SpringMVC进行整合的时候&#xff0c;一般情况下我们会使用不同的配置文件来配置Spring和SpringMVC&#xff0c;因此我们的应用中会存在至少2个ApplicationContext的实例&#xff0c;由于是在Web应用中&#xff0c;因此最…

基于Html+Css的图片展示26

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

AlgoC++第五课:基于矩阵的算法实现

目录 基于矩阵的算法实现前言1. 矩阵2. 矩阵求导推导3. 矩阵示例代码3.1 Matrix.hpp3.2 Matrix.cpp3.3 main.cpp3.4 拓展-cblas_sgemm3.5 拓展-LU分解 4. 多元线性回归5. 多元逻辑回归6. 最小二乘法7. 岭回归(L2)8. 多元牛顿法9. 高斯牛顿法10. Levenberg-Marquardt(修正牛顿法…

[Platforimio] LVGL +TFT_eSPI实现触摸功能

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; 本人持续分享更多关于电子通信专业内容以及嵌入式和单片机的知识&#xff0c;如果大家喜欢&#xff0c;别忘点个赞加个关注哦&#xff0c;让我们一起共同进步~ &#x…

Centos下环境变量

文章内容如下&#xff1a; 1&#xff09;什么是环境变量&#xff1b; 2&#xff09;如何通过程序获取环境变量&#xff1b; 3) 常识规律 一。环境变量的定义 环境变量就是指一段路径。 定义环境变量主要是为了方便的执行程序。添加环境变量的方法是export PATH$PATH:/A/B&…

医用IT隔离电源在医院特殊场所接地系统的应用

【摘要】我们国家大部分医院的临床救治和确诊都是利用了医疗电气类设备和医用的医疗仪器&#xff0c;因此这些地方的接地问题应该引起我们的高度的重视。IT系统主要是利用了中性点没有直接接地的方式&#xff0c;所以可以减少电压和电流&#xff0c;从而使人类触电的可能性小之…

搭建Serv-U FTP服务器共享文件外网远程访问「无公网IP」

文章目录 1. 前言2. 本地FTP搭建2.1 Serv-U下载和安装2.2 Serv-U共享网页测试2.3 Cpolar下载和安装 3. 本地FTP发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 转载自内网穿透工具的文章&#xff1a;使用Serv-U搭建FTP服务器并公网访问【内网穿透】 1. 前言…

Midjourney教程(三)——Prompt常用参数

Midjourney教程——Prompt常用参数 为了提升prompt的准确度与输入效率&#xff0c;让midjourney能够生成我们理想中的图片&#xff0c;我们需要学习一下prompt的常用参数 Version version版本号&#xff0c;midjourney支持多种模型&#xff0c;我们可以通过version参数来选择…

字典树(Trie/前缀树)

目录 字典树的概念 字典树的逻辑 字典树的实现 字典树小结 例题强化 字典树的概念 字典树&#xff08;Trie&#xff09;是一种空间换时间的数据结构&#xff0c;是一棵关于“字典”的树&#xff0c;主要用于统计、排序和保存大量的字符串。字典树是通过利用字符串的公共前…

广域通信网 - 流量控制(停等协议、滑动窗口协议)

文章目录 1 概述2 流量控制协议2.1 停等协议2.2 滑动窗口协议 1 概述 #mermaid-svg-c9cNIYsOvLpoO4AV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-c9cNIYsOvLpoO4AV .error-icon{fill:#552222;}#mermaid-svg-c9c…