算法------排序算法------冒泡排序法

news2024/11/20 18:32:33

介绍

冒泡排序法又称交换排序法,原理是从第一个元素开始,比较相邻元素的大小,如大小顺序有误,则对调后再进行下一个元素的比较,一次扫描之后可以确保最后一个元素位于正确的位置。接下来进行的第二次扫描,以此类推知道所有元素排序完成为止。例如下面的示例:
在这里插入图片描述
由上图可知,5个元素的冒泡排序必须执行5-1次扫描,第一次扫描需要比较5-1次,第二次比较5-1-1次,以此类推,共比较4+3+2+1=10次。

冒泡排序算法分析

n个元素的冒泡排序必须执行n-1次扫描

  • 最坏情况下和平均情况均需比较(n-1)+(n-2)+(n-3)+…+3+2+1=n(n-1)/2次,时间复杂度为O(n^2)。最好情况下只许一次扫描,也就是说没有数据进行交换位置的操作则表示已经排序完成,所以只进行了n-1次比较,时间复杂度为O(n)。
  • 由于冒泡排序为相邻两个数据互相比较后决定是否互换位置,并不会改变原来排序的顺序,因为属于稳定性算法。
  • 因为只需要一个额外的空间,所以空间复杂度为最佳
  • 此排序算法只适用于数据量小或有部分数据已经排序的情况

编码实现

package com.lifly.algorithm.sort;

/**
 * @Author: LiFly
 * @Date: 2023/6/24 20:48
 * @Description: 冒牌排序
 */
public class BubbleSort {

    public static void main(String[] args) {
        int[] data =  {56,24,86,63,16};
        System.out.print("原始数据:");
        BubbleSort bubbleSort = new BubbleSort();
        bubbleSort.showDate(data);
        bubbleSort.bubble(data);



    }

    /**
     * 循环打印数据
     * @param data
     */
    public void showDate(int[] data){
        for (int datum : data) {
            System.out.print(datum+" ");
        }
        System.out.println("\n");
    }

    /**
     * 排序
     * @param data
     */
    public void bubble(int [] data){
        for (int i = data.length-1; i >= 0; i--) {
            for (int j = 0; j < i ; j++) {
                if (data[j+1] < data[j]){
                    int temp = data[j];
                    data[j] = data[j+1];
                    data[j+1] = temp;
                }
            }
            System.out.print("第"+(data.length-i)+"次排序:");
            for (int datum : data) {
                System.out.print(datum+" ");
            }
            System.out.print("\n");
        }
        System.out.print("\n");
        System.out.print("排好序的数据为:");
        showDate(data);
    }
}

结果显示
在这里插入图片描述

效率改进

不管数据是否已排序完成都会固定执行n(n-1)/2次,我们可以使用岗哨的概念改进冒泡排序,以提高程序执行的效率。
代码如下:

package com.lifly.algorithm.sort;

/**
 * @Author: LiFly
 * @Date: 2023/6/24 20:48
 * @Description: 冒牌排序
 */
public class BubbleSort {

    public static void main(String[] args) {
        int[] data =  {16,56,24,63,86};
        System.out.print("原始数据:");
        BubbleSort bubbleSort = new BubbleSort();
        bubbleSort.showDate(data);
        bubbleSort.bubble(data);



    }

    /**
     * 循环打印数据
     * @param data
     */
    public void showDate(int[] data){
        for (int datum : data) {
            System.out.print(datum+" ");
        }
        System.out.println("\n");
    }

    /**
     * 排序
     * @param data
     */
    public void bubble(int [] data){
        for (int i = data.length-1; i >= 0; i--) {
            int flag = 0;
            for (int j = 0; j < i ; j++) {
                if (data[j+1] < data[j]){
                    int temp = data[j];
                    data[j] = data[j+1];
                    data[j+1] = temp;
                    flag++;
                }
            }
            if (flag == 0){
                break;
            }
            System.out.print("第"+(data.length-i)+"次排序:");
            for (int datum : data) {
                System.out.print(datum+" ");
            }
            System.out.print("\n");
        }
        System.out.print("\n");
        System.out.print("排好序的数据为:");
        showDate(data);
    }
}

结果显示
在这里插入图片描述
冒泡排序算法到此就结束了。如果觉得笔者写的能让你学到点东西,麻烦点个关注,感激不尽。喜欢看微信公众号的也可以搜索微信公众号liflyCode那里也有收录

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

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

相关文章

SSMP整合案例(5) Spring Boot整合MyBatis-Plus实现条件查询

讲完条件查询 那么 我们整个数据层的代码就写完了 可以看到 我们之前的代码 查询语句都有一个 参数 QueryWrapper 这个就是查询条件 其实 我们可以直接这样写 QueryWrapper<book> Query new QueryWrapper<>(); bookDao.selectList(Query);QueryWrapper类需要手…

Spring加载后初始化的9种方式

本文来聊一下在spring中&#xff0c;当spring 容器启动后&#xff0c;我们有几种初始化操作的方式。 目录 Spring加载后初始化的几种方式 Component和Service加构造方法 ContextRefreshedEvent事件 代码如下&#xff1a; 输出结果&#xff1a; PostConstruct 注解 代码如…

基于骨骼关键点的动作识别(OpenMMlab学习笔记,附PYSKL相关代码演示)

一、骨骼动作识别 骨骼动作识别是视频理解领域的一项任务 1.1 视频数据的多种模态 RGB&#xff1a;使用最广&#xff0c;包含信息最多&#xff0c;从RGB可以得到Flow、Skeleton。但是处理需要较大的计算量 Flow&#xff1a;光流&#xff0c;主要包含运动信息&#xff0c;处理…

面向对象分析与设计 UML2.0 学习笔记

一、认识UML UML-Unified Modeling Language 统一建模语言&#xff0c;又称标准建模语言。是用来对软件密集系统进行可视化建模的一种语言。UML的定义包括UML语义和UML表示法两个元素。 UML是在开发阶段&#xff0c;说明、可视化、构建和书写一个面向对象软件密集系统的制品的…

Hyper-V虚拟机在wifi环境下的外网连接配置

目录 什么是虚拟交换机管理器了解虚拟交换机中的三个概念通过无线网卡创建虚拟交换机遇到的问题wifi环境下虚拟机外网连接方法 前面我们已经安装好了Hyper-V虚拟机和liunx操作系统&#xff0c;但是我们没有给虚拟机配置网络&#xff0c;本来我以为是一件很简单的事情&#xff0…

【Spring Boot学习】怎么配置文件,配置文件有什么用

前言&#xff1a; &#x1f49e;&#x1f49e;今天我们依然是学习Spring Boot&#xff0c;这里我们会更加了解Spring Boot的知识&#xff0c;知道Spring Boot的配置文件是什么样子的。有什么用&#xff1f;怎么使用Spring Boot的配置文件。 &#x1f49e;&#x1f49e;路漫漫&a…

Apache James 同时开启25、587、465端口

前提&#xff1a; 可以参考如下两篇文章在window或者linux上&#xff0c;先部署好Apache James Apache James邮件服务器搭建&#xff08;linux&#xff09;_Steven-Russell的博客-CSDN博客 Apache James邮件服务器搭建&#xff08;windows&#xff09;_Steven-Russell的博客…

Qt6.2教程——6.QT常用控件QLineEdit

一&#xff0c;QLineEdit简介 QLineEdit是Qt库中的一个控件&#xff0c;它提供了一个单行的文本输入框。用户可以在这个输入框中输入和编辑文本。它可以设置占位符文本&#xff08;Placeholder Text&#xff09;&#xff0c;当QLineEdit为空的时候显示这个占位符文本。它还可以…

JDK8新特性之方法引用【 ::】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于方法引用的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.是什么 二.为什么要用 三.什么时候…

chrome录制保存网络请求

有时候&#xff0c;需要与同事共同查看网络请求&#xff0c;但是现场往往环境限制&#xff0c;导致无法访问环境。在这里推荐一种利用chrome保存网络请求的方法。 准备&#xff1a; 1. chrome浏览器&#xff08;最好版本号是62以上&#xff09; chrome浏览器越新越好(最新稳定…

rsarsa

数学很酷&#xff01;使用RSA算法对秘密消息进行解码&#xff0c;c&#xff0c;p&#xff0c;q&#xff0c;e是RSA算法的参数。 RSA算法还不太了解&#xff0c;经过这段时间的学习&#xff0c;得知 q和p是最开始选择的两个质数&#xff0c;主要是为了计算出钥匙n e是在1到φ(n)…

服务器编程:数据库连接池

引言&#xff1a; 数据库连接池和线程池的思想一样&#xff0c;是为了避免频繁创建和销毁数据库连接导致的性能开销。如果一个项目频繁的需要访问数据库&#xff0c;那么它就有可能需要频繁的创建/销毁数据库连接&#xff0c;那么我们可以采用数据库连接池的技术&#xff0c;在…

Docker中搭建RabbitMQ集群

Docker中搭建RabbitMQ集群 1、启动三个RabbitMQ容器2、为容器设置节点2.1、设置Erlang Cookie2.2、设置节点12.3、设置节点22.4、设置节点32.5、预览结果 3、配置镜像队列3.1、配置镜像的原因3.2、搭建步骤 1、启动三个RabbitMQ容器 服务器IP端口hostname管理界面地址192.168.…

IoC容器的设计(利用反射、注解和工厂模式实现)

1.实验要求 利用注解、反射和工厂模式设计一个简单的IoC容器该IoC容器包含3个注解和一个IoC容器类&#xff08;AnnotationConfigApplicationContext&#xff09;&#xff0c;其定义如下&#xff1a; 注解&#xff1a; 注解含义Component标注BeanAutowired标注需要被注入的对…

如何写好一份企业直播主题策划?

写一份好的直播主题策划&#xff0c;需要考虑包括目标受众、目的、内容、形式、互动等&#xff0c;下面是写企业直播主题策划的一些关注点&#xff0c;希望能帮到您。 定位您直播的目标受众 明确你的直播主题适合的目标受众是谁&#xff0c;他们的兴趣、需求和期望是什么。了解…

OAuth2,jwt,springsecurity之间的区别和联系

OAuth 2.0、JWT (JSON Web Token) 和 Spring Security 是安全相关的概念和技术&#xff0c;它们有着不同的功能和用途。 OAuth 2.0&#xff08;开放授权&#xff09;&#xff1a; OAuth 2.0 是一种授权框架&#xff0c;用于授权第三方应用程序访问用户资源&#xff0c;而无需共…

【OpenCV DNN】Flask 视频监控目标检测教程 10

欢迎关注『OpenCV DNN Youcans』系列&#xff0c;持续更新中 【OpenCV DNN】Flask 视频监控目标检测教程 10 3.10 OpenCV DNNFlask实时监控目标检测1、加载MobileNet SSD模型2、导入分类名称文件3、处理视频帧进行目标检测4、新建一个Flask项目5、Python 程序文件6、视频流的网…

linux系统addr ip以及ifconfig查询不到ip地址解决方法,没有ens33

先看使用情况 网上一堆垃圾博文解决方案都是你抄我我抄你&#xff0c;一点用没有&#xff0c;都说使用 vi /etc/sysconfig/network-scripts/ifcfg-ens33 来更改配置ONBOOT为yes&#xff0c;改个屁&#xff0c;给你们看看我目前的配置&#xff0c;劳资本身就是yes&#xff0c;还…

Elasticsearch 基本使用(二)简单查询 嵌套查询

查询数据 简单查询按id查询单条记录查询所有数据设置排序filter 过滤查询数组内的值查询 嵌套查询查询一个外层字段 内的嵌套字段查询多个字段&#xff0c;其中有嵌套字段 简单查询 按id查询单条记录 GET bank/_doc/1查询所有数据 默认只查询10条记录 GET bank/_search {&q…