【排序算法】冒泡排序

news2024/10/5 14:15:43

文章目录

  • 一:排序算法
    • 1.1 介绍
    • 1.2 分类
  • 二:冒泡排序
    • 2.1 基本介绍
    • 2.2 图解冒泡排序算法
    • 2.3 代码实现
  • 三:算法性能分析
    • 3.1 时间复杂度
    • 3.2 空间复杂度

一:排序算法

1.1 介绍

排序也称排序算法(Sort Algorithm),排序是将一组数据,依指定的顺序进行排列的过程。

1.2 分类

1) 内部排序
指将需要处理的所有数据都加载到内部存储器中进行排序。
2) 外部排序法
数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。
3) 常见的排序算法分类
在这里插入图片描述

二:冒泡排序

2.1 基本介绍

冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。
优化:因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置
一个标志flag判断元素是否进行过交换。从而减少不必要的比较。(这里说的优化,可以在冒泡排序写好后,在进行)

在这里插入图片描述

2.2 图解冒泡排序算法

以3, 9, -1, 10, 20为例

第一趟排序
(1) 3, 9, -1, 10, 20 // 如果相邻的元素逆序就交换
(2) 3, -1, 9, 10, 20
(3) 3, -1, 9, 10, 20
(4) 3, -1, 9, 10, 20

第二趟排序
(1) -1, 3, 9, 10, 20 //交换
(2) -1, 3, 9, 10, 20
(3) -1, 3, 9, 10, 20

第三趟排序
(1) -1, 3, 9, 10, 20
(2) -1, 3, 9, 10, 20

第四趟排序
(1) -1, 3, 9, 10, 20

总结:
(1) 一共进行 数组的大小-1 次 大的循环
(2) 每一趟排序的次数在逐渐的减少
(3) 如果我们发现在某趟排序中,没有发生一次交换, 可以提前结束冒泡排序。这个就是优化

2.3 代码实现

/**
 * @author ikun
 * 冒泡排序
 */
public class BubbleSort {


    /**
     * 冒泡排序
     * 冒泡排序的时间复杂度为O(n的平方)
     *
     * @param array 排序前的数组
     * @return 排序后的数组
     */
    public static int[] bubbleSort(int[] array) {
        for (int i = 0; i < array.length - 1; i++) {
            //标识符,表示有没有进行过交换
            boolean flag = false;
            //内层循环控制两两比较的次数
            //将最大的数排在最后,比较的次数就是数组长度减一次
            for (int j = 0; j < array.length - 1 - i; j++) {
                //两两比较交换位置,比较前后两个数,如果前面的数比后面的数大,则交换
                if (array[j] > array[j + 1]) {
                    int temp = array[j];
                    array[j] = array[j + 1];
                    array[j + 1] = temp;
                    flag = true;
                }
            }
            //System.out.println("第" + (i + 1) + "次排序后的数组为:" + Arrays.toString(array));
            //表示没有发生过交换
            if (!flag) {
                //如果内层循环没有发生任何交换,则说明数组已经排好序了
                break;
            }
        }
        return array;
    }


    /**
     * 这个方法用来测试冒泡排序
     */
    public static void main(String[] args) {
        //int[] array = {59, 66, 14, 89, 12, 16, 20, 63};
        //测试一下冒泡排序的速度O(n的平方),测试80000条数据
        long start = System.currentTimeMillis();
        int[] array = new int[8];
        for (int i = 0; i < array.length; i++) {
            //Math.random() * 80000生成0到80000的随机数
            array[i] = (int) (Math.random() * 100);
        }
        System.out.println("排序前的数组为:" + Arrays.toString(array));
        int[] bubbleSort = bubbleSort(array);
        System.out.println("排序后的数组为:" + Arrays.toString(bubbleSort));

        long end = System.currentTimeMillis();
        System.out.println("执行时间为:" + (end - start));

    }
}

运行结果:
在这里插入图片描述

三:算法性能分析

3.1 时间复杂度

最优时间复杂度、最坏时间复杂度、平均时间复杂度都是O(n^2)。

3.2 空间复杂度

空间复杂度就是在交换元素时那个临时变量所占的内存空间;
最优的空间复杂度就是开始元素顺序已经排好了,则空间复杂度为:0;
最差的空间复杂度就是开始元素逆序排序了,则空间复杂度为:O(n);
平均的空间复杂度为:O(1);

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

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

相关文章

Spring源码分析(五) 事务全流程分析

Spring事务的基础知识 1、注解相关属性 Transactional 注解的属性信息 name 当在配置文件中有多个 TransactionManager , 可以用该属性指定选择哪个事务管理器 propagation 事务的传播行为&#xff0c;默认值为 REQUIRED。 isolation 事务的隔离度&#xff0c;默认值采用 DEF…

AI:11-基于深度学习的鱼类识别

当今,人工智能和深度学习已经成为许多领域的关键技术。在生态学和环境保护领域,鱼类识别是一项重要的任务,因为准确识别和监测鱼类种群对于保护水生生物多样性和可持续渔业管理至关重要。基于深度学习的鱼类识别系统能够自动识别和分类不同种类的鱼类,为生态学研究和渔业管…

ChatGPT Vision初体验

本周&#xff0c;OpenAI为其广受欢迎的 ChatGPT 平台发布了一项突破性的补充。除了处理文本之外&#xff0c;ChatGPT 现在还可以处理图像并聊天。 很难夸大这件事的重要性。目前多达70% 的内容是视觉内容而不是书面内容。人们每年会生成数千张照片&#xff0c;而当今许多最大的…

设计模式 - 结构型模式考点篇:代理模式(静态代理、JDK 动态代理、CGLIB 动态代理)

目录 一、代理模式 一句话概括 1.1、代理模式概述 1.2、静态代理 1.3、JDK 动态代理 1.4、CGLIB 动态代理 1.5、对比三种代理 1.5.1、jdk 代理 VS CGLIB 代理 1.5.2、动态代理 VS 静态代理 1.6、优缺点 1.7、使用场景 一、代理模式 一句话概括 教你将类和对象结合再…

Mac mov转mp4,详细转换步骤

Mac mov转mp4怎么转&#xff1f;视频文件格式为.mov是由Apple公司所开发的特殊格式。因其只能在苹果设备上播放&#xff0c;与他人分享时就会变得困难。为此&#xff0c;我们通常会选择使用MP4这种最受欢迎的视频格式。在日常使用中&#xff0c;MP4成为了大家首选的视频格式。而…

【Docker】 docker中apt-get update过慢,这样配置瞬间提速!

docker中apt-get update过慢&#xff0c;这样配置瞬间提速&#xff01; 源官网全球镜像站 源 今天办公地点的网络出奇的差&#xff0c;看电影看小说打游戏完全没影响&#xff0c;只要更新就蜗速前进&#xff0c;只能从网上翻下&#xff0c;看看有没有网速快的下载源。 碰巧看到…

模范思路,单基因泛癌+实验轻松拿捏sci8+。

今天给同学们分享一篇单基因泛癌单细胞实验的生信文章“Pan-cancer analysis of Krppel-like factor 3 and its carcinogenesis in pancreatic cancer”&#xff0c;这篇文章于2023年8月3日发表在Front Immunol期刊上&#xff0c;影响因子为8.786。 Krppel-like factor 3&#…

vue.js处理数组对象中某个字段是否变为两个字段

一、场景&#xff1a; 产品要求做一个时间步骤条&#xff0c;使用目前后端已返回的数据进行操作实现。时间步骤条要求日期和时间分开显示且相同日期只显示第一个日期。 图左边为实现效果&#xff0c;右边为后台返回的接口。接口中current字段表示当前到达第几步&#xff0c;从…

2023年软件测试工具总结 —— 接口测试工具

接口测试的全称是应用程序编程接口&#xff08;API&#xff09;测试&#xff0c;从原理上来说&#xff0c;接口测试是模拟客户端向服务器端发送请求&#xff0c;然后检查能否获得正确的返回信息。接口测试用于测试RESTful API、SOAP Web服务&#xff0c;这些服务可以通过HTTP、…

Java基础知识总结(2023版)

目录 一、Java基础1、Java 基础2、Java 进阶3、Java8新特性4、Java集合5、Java高并发6、Java代码实例 二、MySQL数据库三、Spring Boot框架&#xff08;35天&#xff09;四、Redis中间件五、MongoDB数据库六、Netty网络编程七、23种设计模式八、微服务九、JavaScript零基础入门…

Aurora中的策略模式和模板模式

Aurora中的策略模式和模板模式 在aurora中为了方便以后的扩展使用了策略模式和模板模式实现图片上传和搜索功能&#xff0c;能够在配置类中设置使用Oss或者minio上传图片&#xff0c;es或者mysql文章搜索。后续有新的上传方式或者搜索方式只需要编写对应的实现类即可&#xff…

批量对比文件夹下文件

软件 产品 | Beyond Compare 中文官方网站 软解破解 Beyond Compare 4密钥过期&#xff0c;解决办法&#xff0c;超实用 批量文件对比 最后显示红色的文件&#xff0c;即为文件两者内容不同的

面了10家却收不到1个offer,自我介绍你踩雷了吗?

每一次离职&#xff0c;都是为了重新开始&#xff1b;每一次寻找新的工作&#xff0c;都面临着巨大的竞争。找工作就像找对象&#xff0c;除了需要一定的缘分外&#xff0c;也需要掌握一定的技巧。 有的人爱恋TA的人排到长城&#xff0c;有的人却一直母胎单身&#xff1b;有的人…

Spring源码解析(十一):spring事务配置类源码

Spring源码系列文章 Spring源码解析(一)&#xff1a;环境搭建 Spring源码解析(二)&#xff1a;bean容器的创建、默认后置处理器、扫描包路径bean Spring源码解析(三)&#xff1a;bean容器的刷新 Spring源码解析(四)&#xff1a;单例bean的创建流程 Spring源码解析(五)&…

vue3使用echarts实现地图撒点、飞线等功能

echarts地图配置参考链接 链接2 vue3使用echarts map.vue <template><div class"echart-demo" id"demo"></div> </template><script setup lang"ts"> //引入echart和json数据 import * as echarts from echarts…

ffmpeg ts 关于av_seek_frame

1 ffmpeg命令行 一般对视频文件的裁剪 我们通过一行 ffmpeg命令行即可实现&#xff0c;比如 ffmpeg -ss 0.5 - t 3 - i a.mp4 vcodec copy b.mp4 其中 -ss 放置较前 开启精准seek定位 对于mp4而言 seek将从moov中相关索引表查找 0.5s时刻附近最近的关键帧 &#xff08;此描述…

systemd服务日志重定向到文件

方式一&#xff08;centos7&#xff09; [Service] ExecStart"/usr/bin/sh test.sh >> info.log 2>&1"方式二&#xff08;centos8&#xff09; StandardOutput 和 StandardError&#xff0c;用于重定向标准输出和标准错误输出 [Service] StandardOut…

k8s containerd查看镜像

直接查看crictl image会报错&#xff1a; 1) crictl config runtime-endpoint unix:///run/containerd/containerd.sock 2) vi /etc/crictl.yaml 3) systemctl daemon-reload 此时&#xff0c;再查看image:

Kettle连接数据库[MySQL]报错

在连接数据库页面填写完成后点击“测试” 报错信息&#xff1a; 错误连接数据库 [ETLqiangzi] : org.pentaho.di.core.exception.KettleDatabaseException: Error occurred while trying to connect to the databaseDriver class org.gjt.mm.mysql.Driver could not be found…

nssm nginx window 部署和开机启动服务

部署 去到Nginx官网&#xff1a;nginx news &#xff0c;然后点击“download” 在nginx的配置文件是conf目录下的nginx.conf nginx.exe http://localhost 在cmd命令窗口里面输入nginx命令(快速停止nginx) &#xff1a; nginx -s stop 或者使用(完整有序的停止nginx)命…