【学习分享】小白写算法之冒泡排序篇

【学习分享】小白写算法之冒泡排序篇

  • 前言
  • 一、什么是冒泡排序算法
  • 二、冒泡排序算法如何实现
  • 三、C语言实现算法
  • 四、复杂度计算
  • 五、算法稳定性
  • 六、小结


前言

最近我要学习下数据结构和算法,有兴趣的小伙伴可以点个关注,一起学习。争取写的浅显易懂。如果你看不懂,那一定是我没学到位。


一、什么是冒泡排序算法

冒泡排序,英文bubblesort,是很容易理解的一种排序方式。想象一下泡泡从水底按顺序冒出就有画面了。
在这里插入图片描述
比如原来有一组6位数序列{4,5,6,3,1,2}
按顺序依次从小到大排列,下面的动图演示了冒泡排序算法。
在这里插入图片描述


二、冒泡排序算法如何实现

那么如何实现冒泡排序算法呢?
还是以动图数组{4,5,6,3,1,2}为例,需要执行6轮,每1轮(设为第i轮)要把遍历后最大的数冒泡到第(6-i)的位置。
在这里插入图片描述

然后看看第i轮冒泡排序做了什么

比如第1轮先把最大数6经过前后比较找了出来,然后把最大数6冒泡到第5的位置。
怎么找到最大数6,通过前后比较,所以是先4和5比较,不需要交换。5和6比较,不需要交换。6和3比较,交换。6和1比较,交换。6和2比较,交换。一共交换5次,结束第1轮。后面每1轮都是执行一样的循环逻辑。
在这里插入图片描述

在第i轮的时候,我们用第j位的数和第j+1位的数进行比较,如果第j+1位的数大于第j位的数,那么就互换;否则就不互换,保持原状。

那么关于冒泡排序算法我们已经基本搞清楚了。


三、C语言实现算法

我们设要比较的数组为arr[]
那么用C语言实现冒泡排序算法的代码就可以写出来了。

#include<stdio.h>void bubblesort(int arr[],int n) //冒泡排序算法
{int temp;for(int i=0;i<n-1;i++)for(int j=0;j<n-i-1;j++)if(arr[j]>arr[j+1])  //如果前一个数>后一个数,那么前后两个数互换{temp = arr[j+1]; arr[j+1] = arr[j];arr[j] = temp;   }
}void print(int arr[],int n)  //打印数组
{for(int i=0;i<n;i++)printf("%d ",arr[i]);
}int main()
{int arr[6] ={4,5,6,3,1,2};printf("冒泡排序前的数组为");print(arr,6);bubblesort(arr,6); //调用冒泡算法printf("\n冒泡排序后的数组为");print(arr,6);
}

用gcc编译并运行可以得到升序的数组序列,符合预期。
在这里插入图片描述


四、复杂度计算

时间复杂度
关于时间复杂度的计算可以看下面这篇文章,浅显易懂。
各位学弟学妹,别再看教材了,时间复杂度看这篇就好了

还是以序列{4,5,6,3,1,2}为例,那么我们一共执行了5+4+3+2+1=15次,推广到n次就是n*(n-1)/2次,那么时间复杂度就是n^2次。
也可以这么理解,c代码中有两个n的嵌套执行语句,那么时间复杂度就是n^2。
记为O(n^2)
在这里插入图片描述
时间复杂度有时候还会考虑最好最坏的情况下的计算,有点超纲了,可以了解下。
冒泡排序最佳情况的时间复杂度,为什么是O(n)
关于最好情况,最坏情况,平均情况复杂度,请参考如下总结文章。
10种排序算法的复杂度,比较,与实现

空间复杂度
关于空间复杂度可以看下面文章
空间复杂度计算超全整理!!(一起手撕复杂度计算)
冒泡排序的空间复杂度怎么计算呢?
在冒泡算法中,我们用到了三个临时变量参数i,j,temp(注意,不是临时的不算在空间复杂度上,所以arr和n不算空间复杂度
在这里插入图片描述

在这里插入图片描述
那就很容易理解了,空间复杂度是O(3),一般都记为O(1)


五、算法稳定性

冒泡排序算法是稳定的吗?首先我们要知道什么是算法稳定性。算法的稳定性是指排序算法在排序过程中能否保持相等的元素的相对顺序。那么很明显冒泡排序在处理两个相同元素的时候是不做处理的,所以冒泡排序算法是稳定的
在这里插入图片描述


六、小结

本文对冒泡排序算法进行了深入浅出的讲解,网上其实有很多大牛写的文章都很不错,都可以相互借鉴学习下。希望大家都能掌握算法真理,码字不易,且行且珍惜~~

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

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

相关文章

解决Toad for Oracle显示乱中文码问题

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…

数据结构记录

之前记录的数据结构笔记&#xff0c;不过图片显示不了了 数据结构与算法(C版) 1、绪论 1.1、数据结构的研究内容 一般应用步骤&#xff1a;分析问题&#xff0c;提取操作对象&#xff0c;分析操作对象之间的关系&#xff0c;建立数学模型。 1.2、基本概念和术语 数据&…

CANoe自带的TCP/IP协议栈中TCP的keep alive机制是如何工作的

TCP keep alive机制我们已经讲过太多次,车内很多控制器的TCP keep alive机制相信很多开发和测试的人也配置或者测试过。我们今天想知道CANoe软件自带的TCP/IP协议栈中TCP keep alive机制是如何工作的。 首先大家需要知道TCP keep alive的参数有哪些?其实就三个参数:CP_KEEP…

Qt QML的枚举浅用

QML的枚举用法 序言概念命名规则在QML定义枚举的规范 用法QML的枚举定义方法供QML调用的&#xff0c;C的枚举定义方法 序言 概念 QML的枚举和C的其实差不多&#xff0c;但是呢&#xff0c;局限比较多&#xff0c;首先不能在main.qml里定义&#xff0c;也不能在子项中定义。 …

C++语言学习(二)——⭐缺省参数、函数重载、引用

1.⭐缺省参数 &#xff08;1&#xff09;缺省参数概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实参则采用该形参的缺省值&#xff0c;否则使用指定的实参。 void Func(int a 0) {cout<<a<<endl; } int…

MySQL的基本操作(超详细)

&#x1f468;‍&#x1f4bb;作者简介&#xff1a;&#x1f468;&#x1f3fb;‍&#x1f393;告别&#xff0c;今天 &#x1f4d4;高质量专栏 &#xff1a;☕java趣味之旅 &#x1f4d4;&#xff08;零基础&#xff09;专栏&#xff1a;MSQL数据库 欢迎&#x1f64f;点赞&…

flutter官方案例context_menus【搭建与效果查看】【省时】

案例地址 https://github.com/flutter/samples/tree/main/context_menus 1&#xff1a;运行查看有什么可以快捷使用的&#xff0c;更新了些什么&#xff0c;可不可以直接复制粘贴 主要内容&#xff1a;在web端中模拟手机类型的点击长按操作&#xff0c;不能直接运行在安卓与io…

如何处理Jenkins打包npm install没有拉取到最新依赖的问题

问题背景&#xff1a; 我们项目中有私有依赖包 frame&#xff0c;是私有服务器上通过 npm 去管理。frame包 publish 之后&#xff0c;通过Jenkins打包时&#xff0c;npm install 一直没有拉取最新的代码。 思考&#xff1a;通过在本地直接替换 node_modules 里的 frame 包&…

element-ui divider 组件源码分享

今日简单分享 divider 组件&#xff0c;主要有以下两个方面&#xff1a; 1、divider 组件页面结构 2、divider 组件属性 一、组件页面结构 二、组件属性 2.1 direction 属性&#xff0c;设置分割线方向&#xff0c;类型 string&#xff0c;horizontal / vertical&#xff0…

SQLite下一代查询规划器(十)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite 查询优化器概述&#xff08;九&#xff09; 下一篇&#xff1a;SQLite的架构&#xff08;十一&#xff09; 1. 引言 “查询规划器”的任务是弄清楚 找出完成 SQL 语句的最佳算法或“查询计划”。 从 SQLi…

VS2013报错The request was aborted: Could not create SSL/TLS secure channel.

问题描述 Visual Studio 2013 Nuget&#xff08;扩展和更新&#xff09;无法连接网络分析和解决方法A connection to the server could not be established because the following error(s) occurred&#xff1a; The request was aborted: Could not create SSL/TLS secure ch…

【问题处理】银河麒麟操作系统实例分享,理光打印机lpr协议打印问题处理

1.问题环境 系统版本&#xff1a;Kylin-Desktop-V10-SP1-General-Release-xxx-20221120-x86_64 内核版本&#xff1a;linux 5.4.18-44kt-generic 系统版本&#xff1a;麒麟v10 sp1 处理器&#xff1a;kx6640ma 2.问题描述 问题详细描述&#xff1a;用户通过lpr协议去连接…

如何申请Telegram机器人 | 推送通知

一、前言 利用Telegram机器人推送通知&#xff0c;需要在环境变量填入正确的TG_BOT_TOKEN以及TG_USER_ID&#xff0c;以下教程简明阐述如何获取Token以及UserID 二、获取步骤 1、首先在Telegram上搜索BotFather机器人。需要注意的是&#xff0c;搜索结果中选择ID为BotFather…

基于SSM+Jsp+Mysql的图书仓储管理系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

浅谈TCP(2):流量控制与拥塞控制

上文浅谈TCP&#xff08;1&#xff09;&#xff1a;状态机与重传机制介绍了TCP的状态机与重传机制。本文介绍流量控制&#xff08;Flow Control&#xff0c;简称流控&#xff09;与拥塞控制&#xff08;Congestion Control&#xff09;。TCP依此保障网络的QOS&#xff08;Quali…

Native Instruments Kontakt 7 for Mac v7.9.0 专业音频采样

Native Instruments Kontakt 7是一款强大的软件采样器&#xff0c;它允许用户从各种来源采样音频并进行编辑和处理。它包含大量预设采样库&#xff0c;包括乐器、合成器、鼓组和声音效果等。此外&#xff0c;Kontakt 7还允许用户创建自己的采样库&#xff0c;以便根据自己的需要…

python ---- %r %s格式输出的区别

在python中&#xff0c; % s和 % r是我们常用的格式符&#xff0c;它们的用法基本一致&#xff0c;但作用却不尽相同&#xff0c;下面简要说明一下两者的区别&#xff1a; 1. % s是将对象 / 变量传递到str()方法中&#xff0c;并将其转化为面向用户的可阅读的格式。 2. % r是将…

》shader程序纹理《--带状渐变

》shader程序纹理《--带状渐变 2022-09-29 10:27 带状渐变&#xff0c;ripple粒子材质 评论(0)

redis群集有三种模式

目录 redis群集有三种模式 redis群集有三种模式 分别是主从同步/复制、哨兵模式、Cluster ●主从复制&#xff1a;主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份&#xff0c;以及对于读操作的负载均…

沐风老师3DMAX建筑砖生成器插件安装使用方法教程

3DMAX建筑砖生成器插件安装使用方法教程 3DMAX建筑砖生成器插件&#xff0c;一键生成建筑砖&#xff08;砖墙&#xff09;。旨在通过快速创建建筑砖来帮助建筑设计师简化向场景添加细节的过程。 【适用版本】 3DMax2013 - 2024 &#xff08;不仅限于此范围&#xff09; 【安装…