排序算法之冒泡排序

news2024/12/26 21:34:59

一般学习过编程的人都知道,排序算法有很多种,包括直接选择排序、直接插入排序、计数排序、快速排序、归并排序、冒泡排序等,在我看来,以上六种排序算法是必须要掌握的,今天,我们先来讲解一下冒泡排序算法,我每次讲解排序算法的时候,都会按四步走,分别是:

(1)学习理解排序原理
(2)举一个例子,模拟排序过程
(3)梳理排序过程中i,j变量的变化
(4)编写代码程序

第一步:学习理解冒泡排序的原理(以从小到大排序为例)

将数组中的每个相邻的元素进行两两比较,按照小的元素在前的原则确定这两个元素是否交换。这样每一轮执行之后,最大的元素就会被交换到最后一位

完成一轮之后,我们就可以再从头进行第二轮的比较,直到倒数第二位时结束(因为最后一位已经是被排序好的了)。这样子一轮之后,第二大的元素就被交换到倒数第二位

然后以此类推……最终数据全部有序了。


根据以上原理的学习,有些人可能感觉到有点抽象,没关系,我们举一个具体的例子来讲解。

第二步:模拟冒泡排序的过程

有一个数组,它的待排元素为:3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48,现在我们要将这组数据进行升序排列,即从小到大排列。

我们可以观察以下动图的排序过程,在排序的过程中,我们可以看到的是,相邻的元素是两两进行比较的,如果左边的元素大于右边的元素,那么就进行交换,否则就不进行交换。

当第一轮排序过后,可以看到50这个最大的数据,已经被排到最后一位了;

当第二轮排序过后,可以看到48这个第二大的数据,已经被排到倒数第二位了;

当第三轮排序过后,可以看到47这个第三大的数据,已经被排到倒数第三位了;

按照原理,以此类推,最终所有的数据都会有序………………记住核心原理,两两比较,大的数据往后冒……

接下来我们一起来思考一个问题,假设我有5, 3, 2 , 4, 1这5个元素,我还是想要对这组数据进行升序排列,那么我需要 进行几轮的排序,才能够使得这组数据有序呢?
第一轮排序:确定5的位置,为最后一位
第二轮排序:确定4的位置,为倒数第二位
第三轮排序:确定3的位置,为倒数第三位
第四轮排序:确定2的位置,为倒数第四位
此时就只剩下1这个元素了,还有必要再进行第五轮排序吗? 没有必要,因为2 3 4 5已经有序了,自然而然,1这个数字已经落在第一个位置了。于是,我们得出一个结论, 如果你有n个数据,那么只需要进行n-1轮的排序就能够把这n个数据给排列有序

第三步:梳理排序过程中i,j变量的变化

原理听起来似乎很简单,但是如果进行编写代码的话,我想会难住很多小伙伴。在这里,我用n代表总共要排序的元素个数,i代表循环的轮数,j代表每一轮比较时的下标位置。

在进行代码编写之前,我们先来思考一个问题,对于n个元素,我们需要进行n-1轮的排序,每一轮进行排序的时候,元素需要进行两两的比较,假设当前的元素为a[j],那么它就应该和a[j+1]这个元素进行比较,对于升序而言,如果a[j]>a[j+1],那么就需要交换这两个元素的位置,否则就不交换。

第二点,每一轮进行两两比较的时候,都需要比较到最后一个元素吗?当然不一定,比如说还是5,3,2,4,1这5个元素,第一轮排序之后变成:3,2,4,1,5;再进行第二轮排序的时候,因为5已经确定了位置,所以这个时候只需要比较3,2,4,1这4个元素即可,5是已排元素,而3,2,4,1是待排元素,我们只需要比较待排元素就好了。第二轮排序结束之后,序列变为:2,3,1,4,5;再进行第三轮排序的时候,只需要比较2,3,1,这3个元素就好了,4,5这两个已排元素无需再管它。也就说,每一轮的排序过程中,j的取值范围是不一样的,j的取值范围会随着排序的轮数变化而变化,而i就代表排序的轮数,即j会随着i的变化而变化。如果你到这里还是觉得很抽象,没关系,稍后的代码会让你一目了然。

根据上面的分析,我们知道,假设有n个元素,那么需要n-1轮的排序,i的取值是0~n-2,而j的取值是0~n-2-i,可以想象一下,当第一轮排序的时候,此时i=0,j的取值范围从0~n-2。当最后一轮排序的时候,i等于n-2,那么此时j的取值范围为:0~0,j取0,j+1取1,让下标0的元素和下标1的元素进行比较一次即可,这一次做完,数据就全部排序完成了。

注意,在编写代码的过程中,数组不要越界。


第四步:编写代码程序

#include<bits/stdc++.h>
using namespace std;
int a[] = {2,5,3,1,7,4,8,9,0,6}; 
void print(int n) {
    for(int i=0;i<n;i++)
        cout << a[i] << " ";
    cout << endl;
}
void bubSort(int n) {
    for(int i=0;i<n-1;i++) {
        bool flag = true;  //假设在这一轮开始之前,序列已经有序 
        for(int j=0;j<n-1-i;j++) {
            if(a[j]>a[j+1]) {
                swap(a[j],a[j+1]);
                flag = false;
            }
        } 
        if(flag==true) {
            break;
        }
        print(n);  //每一轮排序完之后,输出打印查看结果 
    }
}
int main() {
    print(10);
    bubSort(10);
    print(10);
    return 0;
}

代码的编写过程和我讲的有一点不同,不同在我多了一个flag标记变量,它有什么作用呢?它是用来优化我们程序的,我举一个简单的例子,比如有 5 1 2 3 4 ,这5个数,当第一轮排序之后,变成 1 2 3 4 5,可以发现,此时数列已经有序了,接下来还有必要排序吗?显然没有必要了;当第二轮排序的时候发现,这个序列没有任何元素进行交换,说明该序列已经有序了,这个时候我们使用一个标记变量flag来做标记,如果这个标记变量没有改变过,那么这一轮结束,排序算法也可以结束了。第二轮排序完,就可以直接结束排序的过程了,而没有必要进行第3、4轮的排序,继续进行排序也没错,只不过浪费了时间而已。但是时间往往是衡量一个算法最重要的指标。

通过以上的方法,大大提高了冒泡排序的效率,不得不说,冒泡排序算法是一种聪明的排序,当数据有序时,冒泡排序就直接退出了,结束排序过程。


你想要检验你的算法是否学习明白了,最好的方式就是去做题,题目我一般是发布在群里,因为会做另外的讲解。如果你对于以上的代码有任何疑问,你可以私信我,或者你想进入我的算法讨论群也可以私信我…如果你只是想在群里呆着,不说话,不互动,那你不要私信我,谢谢!

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

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

相关文章

Java高手速成 | 新增类Record的工作实例

01、什么是Record? Record 是Java新增的库类&#xff0c;在Java 14和Java 15中以预览&#xff08;preview&#xff09;形式公布。Record类用来自动生成对定义数据进行创建、设置、访问以及比较等代码&#xff0c;所以又被称作数据类&#xff08;data class&#xff09;。在一…

初级开发者福音:手把手教你实现数字滚动效果~

文章目录一、前言二、背景知识三、实现方案Step 1&#xff1a;分析需求Step 2&#xff1a;实现单个数字的滚动效果Step 3&#xff1a;组件接口设计Step 4&#xff1a;完善组件一、前言 前端数字滚动显示的场景很多&#xff0c;比如抽奖的时候&#xff0c;营造一种马上公布中奖…

[MySQL从入门到实战环境部署](超详细版)

MySQL从入门到实战环境部署1.部署CentOS1.1部署CenOS虚拟机步骤&#xff08;1&#xff09;基于VirtualBox&#xff08;2&#xff09;下载CentOS1.2环境部署过程2.部署MySQL1.部署CentOS 1.1部署CenOS虚拟机步骤 &#xff08;1&#xff09;基于VirtualBox 下载网址&#xff1…

Docker Compose:Docker Compose部署nacos初始化MySQL

Docker Compose&#xff1a;Docker Compose部署nacos初始化MySQL找初始化sql文件nacos初始化mysql-schema.sql文件内容docker-compose.yml上传到挂载目录运行docker-compose.yml访问nacos找初始化sql文件 先去官网下载nacos安装包 官方github地址&#xff1a;https://github.…

Centos7安装opengauss

安装包下载地址&#xff1a;https://www.opengauss.org/zh/download/注&#xff1a;本文介绍的是轻量版安装先创建一个系统用户&#xff08;opengauss数据库不允许使用 root 用户安装&#xff09;创建用户useradd omm设置密码passwd omm将安装包拷贝并解压到用户家目录 ~/openG…

linux-云服务器数据盘挂载失败导致进入维护模式

已经在华为云、AWS上面吃过这个亏了&#xff0c;老这样可不好&#xff0c;心怦怦跳的。 华为云是由于服务器升级配置后重启&#xff0c;数据盘名称变化导致进入维护模式。AWS则是由于重启后没有挂载上数据盘&#xff0c;手动编辑/etc/fstab文件错误导致进入维护模式。 究其原…

2022年航空发动机行业研究报告

第一章 行业概况 航空发动机制造指主要用来产生拉力或推力使飞机前进的发动机设备。除了产生前进力外&#xff0c;还可以为飞机上的用电设备提供电力&#xff0c;为空调设备等用气设备提供气源。航空发动机制造产业链包括原材料研发、零部件生产制造、分系统和整机制造。 原材…

大智慧同花顺Level2行情数据有什么用

股市L2是大智慧Level2数据。由“上海证券交易所”最新推出的实时行情信息收费服务&#xff0c;主要提供在上海证券交易所上市交易的证券产品的实时交易数据。该行情速度比传统行情快3秒以上&#xff0c;同时包括十档行情、买卖队列、逐笔成交、总买总卖和统计信息等多种新式数据…

Fabric.js 拖放元素进画布

本文简介 点赞 关注 收藏 学会了 学习 Fabric.js&#xff0c;我的建议是看文档不如看 demo。 本文实现的功能&#xff1a;将元素拖进到画布中并生成对应的图形或图片。 效果如下图所示&#xff1a; 思路 要实现以上效果&#xff0c;需要考虑以下几点&#xff1a; 元素有…

婴儿游泳池行业市场经营管理及未来前景展望分析

2023-2029年中国婴儿游泳池行业市场经营管理及未来前景展望报告报告编号&#xff1a;1691316免费目录下载&#xff1a;http://www.cninfo360.com/yjbg/qthy/ly/20230109/1691316.html本报告著作权归博研咨询所有&#xff0c;未经书面许可&#xff0c;任何组织和个人不得以任何形…

PyQt6快速入门-事件处理

事件处理 文章目录 事件处理1、Qt事件介绍2、常用事件函数2.1 paintEvent事件2.2 鼠标事件2.3 窗口大小改变事件2.4 窗口隐藏/关闭/显示事件2.5 键盘按键事件3、事件拦截4、事件过滤器5、事件队列与事件处理1、Qt事件介绍 Qt GUI应用程序的核心是 QApplication 类。 每个GUI应…

Linux 文件 I/O

1.Linux 应用编程中最基础的知识&#xff0c;即文件 I/O&#xff08;Input、 Outout&#xff09; &#xff0c; 文件 I/O 指的是对文件的输入/输出操作&#xff0c;说白了就是对文件的读写操作&#xff1b; Linux 下一切皆文件&#xff0c;文件作为 Linux 系统设计思想的核心理…

java Lambda表达式引用类方法

Lambda表达式和方法引用是一对孪生兄弟 而引用类方法是Lambda支持的方法引用中的一种 引用类方法其实就是引用类的静态方法 直接上代码 首先 我们要创建一个包 包下创建一个接口 我这里叫subInterface 参考代码如下 public interface subInterface {int convelutl(String s…

【RabbitMQ】SpringBoot整合RabbitMQ

文章目录搭建初始环境引入依赖配置配置文件HelloWorld模型使用Work模型使用Fanout 广播模型Route 路由模型Topic 订阅模型(动态路由模型)搭建初始环境 引入依赖 <!--引入与rabbitmq集成依赖--> <dependency><groupId>org.springframework.boot</groupId…

NKOJ P3549 可见的点

分析 这道题乍一看是一道几何,实际上,是一道法雷数列模板题; 首先,他让我们求有多少条可见的线,实际上是让我们求有多少种不同的斜率可以存在,而斜率就是表现为yx\Large\frac{y}{x}xy​的形式;可以发现,只有当yx\Large\frac{y}{x}xy​为最简分数时,才能算作一条可见的线,其他…

Linux中如何使用Htop监控工具?【网络安全】

一、Htop界面展示 “Htop是一个用于Linux/Unix系统的交互式实时进程监控应用程序&#xff0c;也是top命令的替代品&#xff0c;它是所有Linux操作系统上预装的默认进程监控工具。 Htop还有许多其他用户友好的功能&#xff0c;这些功能在top命令下不可用 在Htop中&#xff0c;…

蓝桥杯省赛习题练习(二)

题目来源&#xff1a;2020年真题题集&#xff08;B组&#xff09; 注&#xff1a;代码都是自己写的&#xff0c;不是参考答案&#xff01; 目录1. 门牌制作运行结果2. 既约分数运行结果3. 蛇形填数运行结果4. 跑步锻炼运行结果5. 7段码6. 成绩统计运行结果7. 回文日期1. 门牌制…

5.9、TCP报文段的首部格式

为了实现可靠传输&#xff0c;TCP 采用了面向字节流\color{red}面向字节流面向字节流的方式。 但 TCP 在发送数据时&#xff0c;是从发送缓存取出一部分或全部字节并给其添加一个首部使之成为 TCP报文段\color{red}\texttt{TCP} 报文段TCP报文段后进行发送。 一个 TCP 报文段由…

ELAN设计理念:通过梯度路径分析设计网络设计策略

设计高效、高质量的表达性网络架构一直是深度学习领域最重要的研究课题。当今的大多数网络设计策略都集中于如何集成从不同层提取的特征&#xff0c;以及如何设计计算单元来有效地提取这些特征&#xff0c;从而增强网络的表现力。本文提出了一种新的网络设计策略&#xff0c;即…

Django框架MVT模型工作流程

Django 一、Django介绍 Django是一个开源的Web应用框架&#xff0c;由Python写成。采用了MTV的框架模式&#xff0c;它最初是被用来做CMS&#xff08;内容管理系统&#xff09;软件。 使用Django&#xff0c;程序员可以方便、快捷地创建高品质、易维护、数据库驱动的应用程序…