数据结构排序算法之冒泡排序

news2025/1/17 5:57:07

一 相关概念

稳定排序:如果原数据中a在b之前,而且a=b,排序后a任然在b之前
不稳定排序:如果原数据中a在b之前,而且a=b,排序后a在b之后
时间复杂度:对排序数据的总的操作次数,反映当n变化时候,操作次数呈现出什么规律
空间复杂度:指算法在计算机内执行时所需要的存储空间的度量,他也是数据规模n的函数。

二 冒泡排序原理

  1. 比较相邻的元素。如果前一个元素比后一个元素大,就交换这两个元素的位置。
  2. 对每一对相邻元素做同样的工作,从开始第一对元素到结尾的最后一对元素。最终最后位置的元素就是最大值。

三 动图分析

在这里插入图片描述

四 代码设计

4.1 API设计

在这里插入图片描述

4.2 API实现

public class Bubble {
    /*
       对数组a中的元素进行排序
    */
    public static void sort(Comparable[] a){
        for(int i=a.length-1;i>0;i--){
            for(int j=0;j<i;j++){
                //{6,5,4,3,2,1}
                //比较索引j和索引j+1处的值
                if (greater(a[j],a[j+1])){
                    exch(a,j,j+1);
                }
            }
        }
    }

    /*
        比较v元素是否大于w元素
     */
    private static  boolean greater(Comparable v,Comparable w){
        return v.compareTo(w)>0;
    }

    /*
    数组元素i和j交换位置
     */
    private static void exch(Comparable[] a,int i,int j){
        Comparable temp;
        temp = a[i];
        a[i]=a[j];
        a[j]=temp;
    }
}

4.3 测试代码

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Integer[] a = {4, 5, 6, 3, 2, 1};
        Bubble.sort(a);
        System.out.println(Arrays.toString(a));
    }
}

4.4 测试结果

![在这里插入图片描述](https://img-blog.csdnimg.cn/a0ae9fa8c4694db89f4d10694a32ce8c.png

五 冒泡排序的时间复杂度分析

冒泡排序使用了双层for循环,其中内层循环的循环体是真正完成排序的代码,所以,
我们分析冒泡排序的时间复杂度,主要分析一下内层循环体的执行次数即可。
在最坏情况下,也就是假如要排序的元素为{6,5,4,3,2,1}逆序,那么:
元素比较的次数为:
(N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)(N-1)/2=N^2/2-N/2;
元素交换的次数为:
(N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)
(N-1)/2=N^2/2-N/2;
总执行次数为:
(N2/2-N/2)+(N2/2-N/2)=N^2-N;
按照大O推导法则,保留函数中的最高阶项那么最终冒泡排序的时间复杂度为O(N^2)

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

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

相关文章

安装Ruby和安装Rails详细步骤详解

rbenv安装Ruby rbenv可以管理多个版本的ruby。可以分为3种范围(或者说不同生效作用域)的版本&#xff1a; local版&#xff1a;本地&#xff0c;针对各项目范围(只在某个目录下有效) global版&#xff1a;全局&#xff0c;没有shell和local版时使用global版 shell版&#xf…

[MySQL]-删库后恢复

[MySQL]-删库后恢复 sen格 | 2022年11月 本文旨在记录个人在数据库的删库恢复演练过程中的一些总结&#xff0c;如有不足&#xff0c;欢迎指正。 一、恢复场景 1&#xff09;假设生产实例MySQL端口为&#xff1a;3306 2&#xff09;本地实例MySQL端口为&#xff1a;3307 在这…

pytorch快速入门

文章目录一、Tensorstensors的初始化(四种):tensors的属性和numpy的联系二、数据集的数据加载器加载数据集标号和可视化自己创建数据集用DataLoaders准备数据用于训练Transforms三、神经网络准备训练设备定义网络的类模型的layersnn.Flattennn.Linearnn.ReLUnn.Sequentialnn.So…

Python之基本扩展模块

一、datetime模块 1.1 主要的模块 datetime.date() #处理日期&#xff08;年、月、日&#xff09; datetime.time() #处理时间&#xff08;时、分、秒和毫秒&#xff09; datetime.datetime() #处理日期时间 datetime.timedelta() #处理时段&#xff08;时间间隔…

基于Java+springboot+SSM的医疗报销系统的设计与实现

项目开发工具: IDEA, MYSQL, JDK1.8 项目使用技术: SpringBoot, SSM, H-UI, JSP, JQUERY, HTML 医疗报销系统【功能列表】 【前台用户】登录,注册,首页新闻轮播图,首页新闻按分类展示列表,栏目分类模块,报销流程模块,修改密码,个人信息展示,新增家庭成员, 家庭成品列表展示,…

Spring框架教程

Spring框架教程Spring框架教程1. 前言2. Spring框架概述2.1 什么是spring?2.2 Spring有哪些优点&#xff1f;2.3 Spring 有两个核心部分&#xff1a;IoC 和AOP2.4 Spring 特点2.5 Spring架构图&#xff0c;Spring由哪些模块组成&#xff1f;3. IOC容器3.1 IOC底层原理3.2 什么…

three.js初时基础

第一步&#xff1a;找到Three.js – JavaScript 3D Library (threejs.org) 第二步 第三步: 第四步&#xff1a; 安装依赖 第五步&#xff1a;新建一个项目文件&#xff0c;在文件中npm init 进行初始化出现一个package.json 第六步&#xff1a;配置安装&#x1f680; 快速开…

QtAV环境配置

本文章主要是使用MSVC编译器&#xff0c;因为QtAV是依赖FFmpeg的&#xff0c;所以需要下载QtAV源码和QtAV-depends-windows-x86x64&#xff1b; 官网地址&#xff1a;http://www.qtav.org/ Github 地址&#xff1a;https://github.com/wang-bin/QtAV 1&#xff0c;解压 将文件…

产品生命周期(PLM)发展历程及技术核心分析指导

产品生命周期管理(Product Lifecycle Management&#xff0c;简称PLM)&#xff0c;是一种为企业产品全生命周期提供服务的软件解决方案&#xff0c;可以应用于在单一地点或分散在多个地点的企业内部&#xff0c;以及在产品研发领域&#xff0c;具有协作关系的企业之间&#xff…

windows 锁屏时执行某个程序

目录 前言 1 打开锁屏事件 2 创建任务计划程序 3 测试 前言 以windows10为例&#xff0c;这个功能的核心是使用windows自带的“任务计划程序”&#xff0c;可以帮助您实现触发器操作。 1 打开锁屏事件 默认情况下&#xff0c;锁屏事件并不会被系统记录&#xff0c;需要手动打…

vue3项目的创建、入口文件、全局方法、生命周期函数、setup中的生命周期函数使用、data的函数方式

文章目录1. 创建vue3项目1.1 基于webpack的工程创建1.2 通过vite来创建vue3项目vue3插件推荐1.3 通过npm init vue3创建项目2. vue3入口文件3. vue3中的全局方法修改4. vue3中封装全局方法5. vue3生命周期函数6. setup中生命周期使用7. data函数方式1. 创建vue3项目 1.1 基于w…

Spring Boot中消息是什么?同步异步消息是啥/都包含那些技术?Activate MQ消息怎么整合

写在前面&#xff1a; 继续记录自己的SpringBoot学习之旅&#xff0c;这次是SpringBoot应用相关知识学习记录。若看不懂则建议先看前几篇博客&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 3.5.4 消息 3.5.4.1 简述 消息发送方&#xff1a;…

力扣(LeetCode)29. 两数相除(C++)

快速乘 题解只使用了 intintint 。 万恶的 INT_MININT\_MININT_MIN&#xff0c;怎么处理&#xff1f;打不过就加入——被除数和除数转为负数计算 。 xxx 除以 yyy &#xff0c;等于从 xxx 中拿出若干个 yyy 。 从 xxx 中拿出 yyy 的数量&#xff0c;就是 xyx\div yxy 的商。 y…

Allegro差分自动添加回流地孔操作指导

Allegro差分自动添加回流地孔操作指导 Allegro自带给差分添加回流地孔的功能,具体操作如下 点击connect命令,任意拉一对差分 鼠标右击,选择Return Path。。。,选择settings 会弹出设置的对话框,Assign net name给孔分配一个网络,一般是GND, Return Path via 选择添加…

2019年1+X 证书 Web 前端开发中级理论考试题目原题+答案——第五套

&#x1f4da;文章目录 &#x1f3af;关于1X标准 &#x1f3af;关于中级考点 ⏩&#x1f4bb;答案速查 理论题(满分100分)&#xff0c;包括单选题、多选题、判断题。 &#x1f4d1;一、单选题&#xff08;每小题2分&#xff0c;共30小题&#xff0c;共60分&#xff09; &…

Docker的基础命令

1.查找可用的镜像 docker search 镜像名 例&#xff1a;docker search nginxdocker search mysql2.拉取官方镜像&#xff08;及下载镜像&#xff09; docker pull 镜像名:标签例&#xff1a;docker pull nginx #表示现在最新版本的nginx镜像docker pull nginx:1.14…

使用frida发送微信消息给好友

前言 之前说过怎么用python来发送微信文本消息&#xff0c;原理大概就是构造内存机器码。其实frida也可以做类似操作&#xff0c;构造数据和机器码&#xff0c;然后调用。我就不重复操作了&#xff0c;这里说下另一种方法。 想使用frida来发送消息这个想法很早之前就有了&…

SQLlite

SQLlite ​ SQLite是一个软件库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。 一、什么是 SQLite ​ SQLite是一个进程内的库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库&…

Webpack 5 超详细解读(三)

21.babel-loader 使用 使用babel-loader对js文件进行处理&#xff0c;在lg.Webpack.js配置文件中配置js文件规则。 使用单独的插件进行转换 使用预设进行转换 使用babel.config.js配置文件进行babel配置 const path require(path) const CopyWebpackPlugin require(copy-W…

解决哈希冲突的方案

什么是哈希表 一种实现关联数组抽象数据类型的数据结构&#xff0c;这种结构可以将关键码映射到给定值。简单来说哈希表&#xff08;key-value&#xff09;之间存在一个映射关系&#xff0c;是键值对的关系&#xff0c;一个键对应一个值。 什么是哈希冲突 当两个不同的数经过…