数据结构与算法之冒泡排序(含改进版)

news2024/9/23 15:57:57

目录

  • 冒泡排序概念
  • 代码实现
  • 时间复杂度
  • 代码改进

冒泡排序概念

冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

运行流程

  • 比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  • 针对所有的元素重复以上的步骤,除了最后一个。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

动图实现
在这里插入图片描述

代码实现

import java.util.Arrays;

public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = {4, 5, 6, 3, 2, 1};
        bubbleSort(arr);
//        [4, 5, 3, 2, 1, 6]
//        [4, 3, 2, 1, 5, 6]
//        [3, 2, 1, 4, 5, 6]
//        [2, 1, 3, 4, 5, 6]
//        [1, 2, 3, 4, 5, 6]
    }

    //冒泡排序,共需要比较length-1轮
    public static void bubbleSort(int[] arr) {
        //控制一共比较多少轮
        for (int i = 0; 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;
                }
            }
            //打印每次排序后的结果
            System.out.println(Arrays.toString(arr)); 
        }
    }
}

时间复杂度

  • 最优时间复杂度:O(n) (表示遍历一次发现没有任何可以交换的元素,排序结束。)
  • 最坏时间复杂度:O(n^2)
  • 稳定性:稳定

排序分析:待排数组中一共有6个数,第一轮排序时进行了5次比较,第二轮排序时进行了4比较,依次类推,最后一轮进行了1次比较。

数组元素总数为N时,则一共需要的比较次数为:(N-1)+ (N-2)+ (N-3)+ ...1=N*(N-1)/2

算法约做了N^2/2次比较。因为只有在前面的元素比后面的元素大时才交换数据,所以交换的次数少于比较的次数。如果数据是随机的,大概有一半数据需要交换,则交换的次数为N^2/4(不过在最坏情况下,即初始数据逆序时,每次比较都需要交换)。

交换和比较的操作次数都与 N^2 成正比,由于在大O表示法中,常数忽略不计,冒泡排序的时间复杂度为O(N^2)

O(N2)的时间复杂度是一个比较糟糕的结果,尤其在数据量很大的情况下。所以冒泡排序通常不会用于实际应用。

代码改进

传统的冒泡算法每次排序只确定了最大值,我们可以在每次循环之中进行正反两次冒泡,分别找到最大值和最小值,如此可使排序的轮数减少一半

import java.util.Arrays;

public class BubbleSort {
    public static void main(String[] args) {
        int[] arr = {4, 5, 6, 3, 2, 1};
        bubbleSort(arr);
//        [1, 4, 5, 3, 2, 6]
//        [1, 2, 4, 3, 5, 6]
//        [1, 2, 3, 4, 5, 6]
    }

    //冒泡排序改进
    public static void bubbleSort(int[] arr) {
        int left = 0;
        int right = arr.length - 1;
        while (left < right) {
            //正向冒泡,确定最大值
            for (int i = left; i < right; ++i) {
                //如果前一位大于后一位,交换位置
                if (arr[i] > arr[i + 1]) {
                    int temp = arr[i];
                    arr[i] = arr[i + 1];
                    arr[i + 1] = temp;
                }
            }
            --right;

            //反向冒泡,确定最小值
            for (int j = right; j > left; --j) {
                //如果前一位大于后一位,交换位置
                if (arr[j] < arr[j - 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j - 1];
                    arr[j - 1] = temp;
                }
            }
            ++left;
            
            System.out.println(Arrays.toString(arr));
        }
    }
}

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

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

相关文章

产品新说 | 指标的异常检测怎么做,能更好配合业务变化(二)

前言&#xff1a;上期分享我们提到了指标异常检测实践要素中的三个方面&#xff1a;以面对业务变动为前提&#xff0c;确定业务波动是周期性还是非周期性&#xff0c;进而选对算法&#xff1b;通过确认业务的常规指标&#xff0c;确定异常方向进行监测&#xff08;上基带 / 下基…

【夏虫语冰】Win10局域网下两台电脑无法ping通: 无法访问目标主机

文章目录1、简介2、修改高级共享设置3、启用防火墙规则4、局域网内的其他主机访问NAT模式下的虚拟机4.1 虚拟机网络设置4.2 访问测试4.2.1 http测试4.2.2 curl测试4.2.3 telnet测试4.2.4 端口占用测试5、其他结语1、简介 ping 192.168.31.134ping主机ip时&#xff0c;访问无法…

华为OD机试模拟题 用 C++ 实现 - 学校运动会(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 最多获得的短信条数(2023.Q1)) 文章目录 最近更新的博客使用说明学校运动会题目输入输出示例一输入输出示例一输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高…

Python--深入浅出的装饰器--2

前言如果上一章没怎么看懂&#xff0c;那么本章就放弃吧。好了&#xff0c;本章一起看看装饰器的另一种用法&#xff0c;带参数的装饰器。废话总结一下&#xff0c;经过前一章的学习&#xff0c;其实不难看出&#xff0c;装饰器的模板其实就是在此基础上&#xff0c;我们可以肆…

推荐几个实用的在线教程(建议收藏)

hello&#xff0c;大家好&#xff0c;我是木荣君。作为一名技术人员&#xff0c;工作中熟练使用各种管理及设计工具是一项必备的技能。今天给大家分享一下我工作中经常查看和学习的几个在线教程地址。供大家参考学习&#xff0c;建议收藏&#xff0c;真的很实用&#xff01; Gi…

IEEE Fellow李海洲:远渡重洋,万里求索,“机器智能对话”是毕生所求

一直来到实叻坡&#xff0c;乜事无。上山来做工&#xff0c;伯公“多隆”保平安。——潮州过番歌 所谓“过番”&#xff0c;指早期潮州人外出务工&#xff0c;乘坐小船历经七天七夜到达东南亚谋生&#xff0c;“实叻坡”是马来语“Selat”的音译词&#xff0c;便是指“新加坡”…

djvu批量转换为pdf的工具和djvu阅读器(附下载链接)

简介 DjVuToy是一款美观易用、功能强大的DjVu处理工具&#xff0c;DjVuToy官方版功能包括图像文件转DjVu&#xff0c;支持PDG、BMP、GIF等格式。转换的同时可以进行OCR&#xff0c;生成双层DjVu。可以插入、删除、移动、旋转多页DjVu中的页面。还可以将多个DjVu文件合并成一个&…

《数据库系统概论》学习笔记——第一章:绪论

教材为数据库系统概论第五版&#xff08;王珊&#xff09; 第一章基本就纯概念了&#xff0c;考试基本就考简答题啥的。概念还是比较多&#xff0c;平时没事就看看记一下&#xff0c;重点看一些有比较的部分&#xff0c;比如文件管理和数据库的区别&#xff0c;各种数据模型之间…

阶段十:总结专题(第七章:分布式篇)

阶段十&#xff1a;总结专题&#xff08;第七章&#xff1a;分布式篇&#xff09;Day-第七章&#xff1a;分布式篇1. CAP 定理**CAP 定理****不一致的产生**<font color #FF0000>**保证一致性**<font>**保 CP 失 A****保 AP 失 C****一致性级别**2. Paxos 算法**Pa…

c++之引用

目录 引用的概念 引用做函数参数 引用的本质 常引用 引用的概念 在c中新增加了引用的概念&#xff0c;引用可以看作一个已定义变量的别名。 引用的语法&#xff1a;Type &name var; int main() {int a 10;int &b a;printf("b%d\n", b);printf(&quo…

three.js学习:给obj模型设置发光并解决渲染变暗问题

需求描述&#xff1a; 使用obj模型和mtl材质绘制地图&#xff0c;为地图边界添加发光边界线。 实现思路&#xff1a; 借助three.js的OutlinePass管道和Raycaster光线投射实现发光线条 实现步骤&#xff1a; 1、引入相关js文件 EffectComposer&#xff1a;用于实现three.js…

单片机电路设计中的10个难点

单片机是嵌入式系统的核心元件&#xff0c;使用单片机的电路要复杂得多&#xff0c;但在更改和添加新功能时&#xff0c;带有单片机的电路更加容易实现&#xff0c;这也正是电器设备使用单片机的原因。那么在单片机电路的设计中需要注意的难点有哪些&#xff1f;一、单片机上拉…

【高性能计算】TVM使用TE手动优化矩阵乘法算法解析与代码解读

引言 注&#xff1a;本文主要介绍、解释TVM的矩阵优化思想、代码&#xff0c;需要配合代码注释一起阅读。 矩阵乘法是计算密集型运算。为了获得良好的 CPU 性能&#xff0c;有两个重要的优化措施&#xff1a; 提高内存访问的高速缓存命中率。复杂的数值计算和热点内存&#x…

「TCG 规范解读」TCG 主规范-设计原则

可信计算组织(Ttrusted Computing Group,TCG)是一个非盈利的工业标准组织,它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立,并采纳了由可信计算平台联盟(the Trusted Computing Platform Alliance,TCPA)所开发的规范。现在的规范都不是最终稿,都…

【Python】元组如何创建?

嗨害大家好鸭&#xff01;我是小熊猫~ Python 元组 Python 的元组与列表类似&#xff0c; 不同之处在于元组的元素不能修改。 元组使用小括号&#xff0c;列表使用方括号。 元组创建很简单&#xff0c;只需要在括号中添加元素&#xff0c; 并使用逗号隔开即可。 如下实例…

【线性筛】ccpc黑龙江省赛 F

第一次vp省赛&#xff0c;只出了三题&#xff0c;很寄啊Problem - F - Codeforces题意&#xff1a;思路&#xff1a;题目一直在强调最小质因子&#xff0c;我们考虑边跑线性筛边求贡献一、对于第一种情况&#xff0c;即遇到的数是质数&#xff0c;贡献直接1就好了二、对于第二种…

mac在命令行里获取root权限

1、为什么要获取root权限&#xff1f; 答&#xff1a;一些命令在正常状态下没有权限会报错&#xff0c;只有获取了root权限才能正常操作。 比如我们想修改一些系统的文件&#xff1a; vim /etc/shells 1 修改后保存&#xff0c;发现没权限&#xff0c;报错了。如下图&#xf…

MaxWell原理概述

文章目录1.MaxWell概述2.Maxwell输出数据格式3.Maxwell原理3.1 MySQL二进制日志3.2 MySQL主从复制1.MaxWell概述 Maxwell 是由美国Zendesk公司开源&#xff0c;用Java编写的MySQL变更数据抓取软件。它会实时监控Mysql数据库的数据变更操作&#xff08;包括insert、update、dele…

传输层重点协议

1.TCP协议 TCP&#xff0c;即Transmission Control Protocol&#xff0c;传输控制协议。人如其名&#xff0c;要对数据的传输进行一个详细的控制。 TCP协议段格式 源/目的端口号&#xff1a;表示数据是从哪个进程来&#xff0c;到哪个进程去&#xff1b;32位序号/32位确认号…

第三章-OpenCV基础-6-滤波处理

前置内容 在尽量保留图片原有信息的情况下,过滤掉图像内部的噪声的过程成为对图像的平滑处理(又称滤波处理),所得到的图像成为平滑图像(把图像中的噪点过滤掉,生成一个相对平滑的图像)。 举个栗子: 一个图像有个噪点,加载发现有个点的像素值和周边像素值差异太大格格不入,使用…