【数据结构】——排序之冒泡排序

💞💞 前言

hello hello~ ,这里是大耳朵土土垚~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹
在这里插入图片描述

💥个人主页:大耳朵土土垚的博客
💥 所属专栏:数据结构学习笔记 、排序算法合集
💥对于数据结构顺序表、链表、堆有疑问的都可以在上面数据结构的专栏进行学习哦~ 有问题可以写在评论区或者私信我哦~

前面我们学习过四种排序——直接插入排序、希尔排序、直接选择排序和堆排序,今天我们就来学习交换排序的一种——冒泡排序。

1.什么是冒泡排序?

冒泡排序(BubbleSort)是一种计算机科学领域的较简单的排序算法。它的基本思想是通过重复遍历待排序的数据集,并依次比较相邻的两个数据项,如果它们的顺序错误则进行交换。这个过程会持续重复直到所有相邻的数据项都已经交换完毕,此时说明该数据集已经排好序。冒泡排序的名称来源于排序过程中,较小的数据项会被逐渐“浮”到数组顶部,这个过程就像碳酸饮料中二氧化碳气泡最终会上浮到顶部的现象一样。因此,这种排序算法因其这一特性而得名。

冒泡函数的核心思想就是:两两相邻的元素进行比较,一轮下来最大的或者最小的就会被交换到最后面,每一轮都得到该轮的最值排到后面,如果是升序就得到最大值,降序就是最小值,排n轮直到有序。

如下动图演示:

在这里插入图片描述

2.冒泡排序代码实现(升序)

2.1基础版(升序)

void bubble_sort(int arr[], int sz)//参数接收数组元素个数
 
{
 for(int i=0; i<sz-1; i++)//排sz-1趟
 
 {
 for(int j=0; j<sz-i-1; j++)//一趟排序
 
 {
 if(arr[j] > arr[j+1])//前面的大就交换到后面,直到最后得到升序
 
 {
 //交换
 int tmp = arr[j];
 
 arr[j] = arr[j+1];
 
 arr[j+1] = tmp;
 
 }
 
 }
 
 }
 
}
//打印数据 
int main()
 
{
 
 int arr[] = {3,1,7,5,8,9,0,2,4,6};
 
 int sz = sizeof(arr)/sizeof(arr[0]);
 
 bubble_sort(arr, sz);
 
for(int i=0; i<sz; i++)
 
 {
 
 printf("%d ", arr[i]);
 
 }
 
 return 0;
 
}

这里注意使用两层for循环嵌套来实现,一层用来实现一趟排序所要进行的步骤,最外层for循环则表示这样的步骤要实现size-1次才能得到有序,每一趟排序都得到最值,排到后面,直到有序。

结果如下:
在这里插入图片描述

2.2进阶版(升序)

进阶实现

我们发现上述代码即使在排序过程中有序了,该跑size-1趟还是不会少,它才不管你有没有序,我只要跑我的size-1趟就好了,这样就会大大消耗我们的时间,所以我们的想个方法一旦它有序冒泡排序就停下;

解决思路

我们可以思考它什么是会有序呢?是不是一趟下来什么都没交换这样就可以判定为有序了,所以我们可以使用一个变量flag来标记。代码如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void bubble_sort(int arr[], int sz)//参数接收数组元素个数

{
	for (int i = 0; i < sz - 1; i++)//排sz-1趟

	{
		int flag = 0;//没趟排序开始flag清0
		for (int j = 0; j < sz - i - 1; j++)//一趟排序

		{
			if (arr[j] > arr[j + 1])//前面的大就交换到后面,直到最后得到升序

			{
				flag++;//有交换flag就++
				//交换
				int tmp = arr[j];

				arr[j] = arr[j + 1];

				arr[j + 1] = tmp;

			}

		}
		//一趟排序后查看flag值
		if (flag == 0)//如果flag = 0 ,也就是没有发生交换直接return即可
			return;

	}

}
//打印数据 
int main()

{

	int arr[] = {9,1,2,3,4,5,6,7,8};

	int sz = sizeof(arr) / sizeof(arr[0]);

	bubble_sort(arr, sz);

	for (int i = 0; i < sz; i++)

	{

		printf("%d ", arr[i]);

	}

	return 0;

}

将flag设在每趟排序里面,如果有交换flag就++;没有flag值就是0说明此时有序可以直接返回;注意不要忘了每趟排序完flag都要清0哦~不然下次使用即时没有发生交换flag也不为0;

使用int arr[] = {9,1,2,3,4,5,6,7,8};来测试结果如下:
在这里插入图片描述

3.冒泡排序代码实现(降序)

学习完升序,降序对我们来说简直是老虎吃豆芽——小菜一碟,只需将交换的条件由大于改成小于号即可

if (arr[j] < arr[j + 1])//前面的小就交换到后面,直到最后得到升序

完整代码实现如下:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
void bubble_sort(int arr[], int sz)//参数接收数组元素个数

{
	for (int i = 0; i < sz - 1; i++)//排sz-1趟

	{
		int flag = 0;//没趟排序开始flag清0
		for (int j = 0; j < sz - i - 1; j++)//一趟排序

		{
			if (arr[j] < arr[j + 1])//前面的小就交换到后面,直到最后得到升序

			{
				flag++;//有交换flag就++
				//交换
				int tmp = arr[j];

				arr[j] = arr[j + 1];

				arr[j + 1] = tmp;

			}

		}
		//一趟排序后查看flag值
		if (flag == 0)//如果flag = 0 ,也就是没有发生交换直接return即可
			return;

	}

}
//打印数据 
int main()

{

	int arr[] = {9,1,2,3,4,5,6,7,8};

	int sz = sizeof(arr) / sizeof(arr[0]);

	bubble_sort(arr, sz);

	for (int i = 0; i < sz; i++)

	{

		printf("%d ", arr[i]);

	}

	return 0;

}

结果如下:
在这里插入图片描述

4.冒泡排序时间复杂度分析

时间复杂度往往分析最坏的情况,所以在分析冒泡排序时我们可以当作冒泡了size-1次,假设有n个数,也就是n-1次,每次又两两相比较,第一次比较n-1下,第二次n-2…最后一次1下,将这n-1次加起来就可以知道冒泡排序的时间复杂度啦~ 利用等差数列求和很容易算出来结果并区取最大的数量级n^2即可;
🥳🥳所以冒泡排序的时间复杂度是O(n^2)

5.结语

以上就是有关冒泡排序的所以内容啦~ 有问题的或者不懂的可以写在评论区或者私信我哦 ~ 完结撒花~🥳🥳🎉🎉🎉

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用CSS3画出一个叮当猫HTML源码

我们经常使用PS或者Flash制作动画&#xff0c;本文则介绍了如何用CSS3画出个叮当猫&#xff0c;实现过程很有趣&#xff0c;感兴趣的朋友可以参考一下 首先&#xff0c;先把HTML结构搭建好&#xff1a; <div class"wrapper"> <!--叮当猫整体--> <di…

【3GPP】【核心网】【4G】4G手机接入过程,手机附着过程(超详细)

1. 4G手机接入过程&#xff0c;手机附着过程 附着&#xff08;Attach&#xff09;&#xff1a; 终端在PLMN中注册&#xff0c;从而建立自己的档案&#xff0c;即终端上下文 进行附着的三种情况&#xff1a; ①终端开机后的附着&#xff0c;初始附着 ②终端从覆盖盲区返回到…

Day41:WEB攻防-ASP应用HTTP.SYS短文件文件解析Access注入数据库泄漏

目录 ASP-默认安装-MDB数据库泄漏下载 ASP-中间件-CVE&短文件&解析&写权限 HTTP.SYS&#xff08;CVE-2015-1635&#xff09;主要用作蓝屏破坏&#xff0c;跟权限不挂钩 IIS短文件(iis全版本都可能有这个问题) IIS文件解析 IIS写权限 ASP-SQL注入-SQLMAP使用…

基于python+vue的OA公文发文管理系统flask-django-php-nodejs

系统根据现有的管理模块进行开发和扩展&#xff0c;采用面向对象的开发的思想和结构化的开发方法对OA公文发文管理的现状进行系统调查。采用结构化的分析设计&#xff0c;该方法要求结合一定的图表&#xff0c;在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”的…

数据挖掘与分析学习笔记

一、Numpy NumPy&#xff08;Numerical Python&#xff09;是一种开源的Python库&#xff0c;专注于数值计算和处理多维数组。它是Python数据科学和机器学习生态系统的基础工具包之一&#xff0c;因为它高效地实现了向量化计算&#xff0c;并提供了对大型多维数组和矩阵的支持…

鸿蒙预览报错 Only files in a module can be previewed

HarmonyOS第一课下载的源码无法运行&#xff0c;也无法预览&#xff0c;报错如题。 解决&#xff1a; 1、在预览页如“index.ets”文件下预览。 2、如果在通知栏看到如图提示&#xff0c;可看出是ohos/hvigor-ohos-plugin插件版本的问题&#xff0c;可点击蓝色解决方案同步并导…

01-Spark的Local模式与应用开发入门

1 Spark 的 local 模式 Spark 运行模式之一&#xff0c;用于在本地机器上单机模拟分布式计算的环境。在 local 模式下&#xff0c;Spark 会使用单个 JVM 进程来模拟分布式集群行为&#xff0c;所有 Spark 组件&#xff08;如 SparkContext、Executor 等&#xff09;都运行在同…

获取淘宝商品评论的爬虫技术分享(已封装API,可测试)

item_review-获得淘宝商品评论 公共参数 请求地址: taobao/item_review 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,it…

基于python+vue网络相册设计与实现flask-django-nodejs-php

网络相册设计与实现的目的是让使用者可以更方便的将人、设备和场景更立体的连接在一起。能让用户以更科幻的方式使用产品&#xff0c;体验高科技时代带给人们的方便&#xff0c;同时也能让用户体会到与以往常规产品不同的体验风格。 与安卓&#xff0c;iOS相比较起来&#xff0…

python 函数(解包**、互相调用、作用域、函数的封装、内置函数:eval()、zip()、文件处理open())

函数解包 """ 1、函数的注释&#xff1a;参数和返回值 在注释里可以自动添加显示&#xff0c;只需手动加说明。2、函数的解包【拆包】&#xff1a;函数的参数要传递数据有多个值的时候&#xff0c;中间步骤拿到数据 保存在元组或者列表 或者字典里。 - 传递参数…

机器学习-06-无监督算法-01-划分聚类Kmeans算法

总结 本系列是机器学习课程的系列课程&#xff0c;主要介绍机器学习中无监督算法&#xff0c;包括划分聚类等。 参考 数据分析实战 | K-means算法——蛋白质消费特征分析 欧洲48国英文名称的来龙去脉及其国旗动画 Kmeans在线动态演示 本门课程的目标 完成一个特定行业的…

【C#】使用C#窗体应用开启/停止Apache、MySQL服务

目录 一、前言 二、效果图 三、配置文件 四、代码 五、一键启动/停止所有服务 一、前言 使用C#窗体应用开启Apache、MySQL服务&#xff0c;不仅仅是Apache、MySQL&#xff0c;其他服务也可以使用同样的方法操作&#xff0c;包括开启自己写的脚本服务。 二、效果图 两种状…

短视频矩阵系统--技术实际开发打板3年真实开发分享

短视频矩阵系统--技术实际开发打板3年真实开发分享&#xff0c;短视频矩阵系统/矩阵获客系统是一种基于短视频平台的获客游戏。短视频矩阵系统可以通过多账号发布来替代传统的单账号游戏。可以一键发布所有账号&#xff0c;批量制作多个视频AI智能剪辑。过去很多人只能完成的工…

新版仿蓝奏网盘|城通网盘|百度网盘|闪客网盘|网盘源码系统,个人网盘系统

(购买本专栏可免费下载栏目内所有资源不受限制,持续发布中,需要注意的是,本专栏为批量下载专用,并无法保证某款源码或者插件绝对可用,介意不要购买!购买本专栏住如有什么源码需要,可向博主私信,第二天即可发布!博主有几万资源) 这是一款仿蓝奏网盘、城通网盘、百…

利用CSS3实现正在加载效果

一、代码区域 1.1css3代码 <style>* {padding: 0;margin: 0;list-style: none;}.loading {width: 300px;height: 100px;margin: 100px auto;}.loading ul {height: 100px;width: 65px;margin: 0 auto;display: flex;align-items: center;}.loading ul li {margin: 0 5p…

【XR806开发板试用】使用PWM模块模拟手机呼吸灯提示功能

一般情况下&#xff0c;我们的手机在息屏状态&#xff0c;当收到消息处于未读状态时&#xff0c;会有呼吸灯提醒&#xff0c;这次有幸抽中XR806开发板的试用&#xff0c;经过九牛二虎之力终于将环境搞好了&#xff0c;中间遇到各种问题&#xff0c;在我的另一篇文章中已详细描述…

Nginx 全局块配置 worker 进程的两个指令

1. 前言 熟悉 nginx 运行原理的都知道&#xff0c;nginx 服务启动后&#xff0c;会有一个 master 进程和多个 worker 进程&#xff0c;master 进程负责管理所有的 worker 进程&#xff0c;worker 进程负责处理和接收用户请求 在这里我们所要研究的是 master 进程一定要创建 wo…

后端前行Vue之路(一):初识Vue

1.Vue是什么 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。另一方…

罗格朗逸景PLUS IOT智能系统发布,为您提供更智能的生活体验!

罗格朗全新推出的逸景PLUS IOT智能系统现已正式上市,采用纤薄纯平的设计,功能丰富全面,支持灯光/温度/场景控制、背景音乐等多种功能,整合罗格朗IOT2.0系统,集成可视对讲,为用户打造更舒适、安全的智能生活。 罗格朗智能家居 罗格朗是全球电气与智能建筑系统专家,创立于1865年…

基于Java中的SSM框架实现考研指导平台系统项目【项目源码+论文说明】计算机毕业设计

基于Java中的SSM框架实现考研指导平台系统演示 摘要 应对考研的学生&#xff0c;为了更好的使校园考研有一个更好的环境好好的学习&#xff0c;建议一个好的校园网站&#xff0c;是非常有必要的。提供学生的学习提供一个交流的空间。帮助同学们在学习高数、学习设计、学习统计…