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

💞💞 前言

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/489259.html

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

相关文章

HarmonyOS入门笔记1配置环境

文章目录 下载安装DevEco Studio配置环境先认识DevEco Studio界面工程目录工程级目录模块级目录 app.json5module.json5main_pages.json通知栏预览区 运行模拟器 下载安装DevEco Studio 去官网下载DevEco Studio完了安装 配置环境 打开已安装的DevEco Studio快捷方式进入配置…

Python爬虫:爬虫基本概念、流程及https协议

本文目录&#xff1a; 一、爬虫的基本概念1.为什么要学习爬虫1.1 数据的来源1.2 爬取到的数据用途 2.什么是爬虫3. 爬虫的更多用途 二、爬虫的分类和爬虫的流程1.爬虫的分类2.爬虫的流程3.robots协议 三、爬虫http和https1.http和https的概念2.浏览器发送HTTP请求的过,2.1 http…

【数据结构刷题专题】—— 二分查找

二分查找 二分查找模板题&#xff1a;704. 二分查找 二分查找前提&#xff1a; 有序数组数组中无重复元素 左闭右闭&#xff1a; class Solution { public:int search(vector<int>& nums, int target) {int left 0;int right nums.size() - 1;while (left <…

An Experimental Study of State-of-the-Art Entity Alignment Approaches论文阅读

最先进的实体对齐方法的实验研究综述 Title: An Experimental Study of State-of-the-Art Entity Alignment Approaches 日期: 2022 发表单位: IEEE github: https://github.com/DexterZeng/EAE 原文地址: https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber9174835 概括…

启扬RK3568核心板助力智慧步道轻装健身,打造全民健康生活新方式

随着物联网、AI智能等新技术的快速发展&#xff0c;智慧步道成为全国各地公园建设和全民健身公共服务设施改造的新主题。智慧步道基于物联网、人脸识别、大数据分析等技术&#xff0c;对人们的运动进行监测和数据采集&#xff0c;显示运动数据&#xff0c;包括里程统计、热量消…

档案四性检测可复用组件接口说明

nhdeep提供在归档、移交与接收、长期保存等各环节根据需求进行自主配置和调用的可复用组件&#xff0c;支持客户端和接口调用两种功能使用模式。档案四性检测组件为自建档案管理系统和各种业务系统&#xff08;如OA&#xff09;&#xff0c;提供标准化的档案四性检测功能利用&a…

YOLOv5改进系列:主干ConvNeXTV2结构助力涨点

一、论文理论 论文地址&#xff1a;ConvNeXt V2: Co-designing and Scaling ConvNets with Masked Autoencoders 1.理论思想 ConvNeXt V2 在 ConvNeXt 的基础上增加了两个创新点&#xff08;一个 framework 和一个 technique&#xff09;&#xff1a;全卷积掩码自编码器&…

人工智能 框架 paddlepaddle 飞桨 使用指南 使用例子 线性回归模型demo 1

安装过程&使用指南&线性回归模型 使用例子 本来预想 是安装 到 conda 版本的 11.7的 但是电脑没有gpu 所以 安装过程稍有变动,下面简单讲下 conda create -n paddle_env117 python=3.9 由于想安装11.7版本 py 是3.9 所以虚拟环境名称也是 paddle_env117 activa…

nuxt3使用自定义组件

说明&#xff1a;nuxt3只有components文件夹里面的页面会自动注册为组件&#xff0c;但是有些单独的页面也需要组件&#xff0c;但是也不是全局的&#xff0c;所以写在pages里面的页面&#xff0c;需要手动注册为组件使用 1.创建组件 在pages里面创建页面文件夹&#xff0c;在…

【node】express使用(三)

1、express.static快速托管静态资源 express:快速、开放、极简的Web开发框架。(npm第三方包&#xff0c;提供快速创建web服务器便捷方法) Express中文官网 (1) express快速创建web网站服务器以及api接口服务器 // 1、导入express const express require(express) // 2、创…

【 Vue 3 】Vue3.0所采用的CompositionApi与Vue2.x使用的Options Api 有什么不同?

1. 开始之前 Composition API可以说是Vue3的最大特点&#xff0c;那么为什么要推出Composition Api,解决了什么问题? 通常使用Vue2开发的项目&#xff0c;普遍会存在以下问题&#xff1a; 代码的可读性随着组件变大而变差每一种代码复用的方式&#xff0c;都存在缺点TypeScr…

搭建Spark单机版环境

在搭建Spark单机版环境的实战中&#xff0c;首先确保已经安装并配置好了JDK。然后&#xff0c;从群共享下载Spark安装包&#xff0c;并将其上传至目标主机的/opt目录。接着&#xff0c;解压Spark安装包至/usr/local目录&#xff0c;并配置Spark的环境变量&#xff0c;以确保系统…

高效解决Visual Studio无法识别到自定义头文件

文章目录 问题解决方案 问题 说明你没有好好配置项目属性 解决方案 把头文件都集中存放到一个文件夹里 之后我会持续更新&#xff0c;如果喜欢我的文章&#xff0c;请记得一键三连哦&#xff0c;点赞关注收藏&#xff0c;你的每一个赞每一份关注每一次收藏都将是我前进路…

[C++]C/C++内存管理——喵喵要吃C嘎嘎5

希望你开心&#xff0c;希望你健康&#xff0c;希望你幸福&#xff0c;希望你点赞&#xff01; 最后的最后&#xff0c;关注喵&#xff0c;关注喵&#xff0c;关注喵&#xff0c;大大会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的…

鸿蒙Harmony跨模块交互

1. 模块分类介绍 鸿蒙系统的模块一共分为四种&#xff0c;包括HAP两种和共享包两种 HAP&#xff08;Harmony Ability Package&#xff09; Entry&#xff1a;项目的入口模块&#xff0c;每个项目都有且只有一个。feature&#xff1a;项目的功能模块&#xff0c;内部模式和En…

在Semantic Kernel中使用Qdrant向量数据库

本文将介绍如何在Semantic Kernel中使用Qdrant向量数据库&#xff0c;并演示如何在Semantic Kernel中进行向量更新和查询操作。 1. 背景 在前一篇文章《Qdrant 向量数据库的部署以及如何在 .NET 中使用 TLS 安全访问》中&#xff0c;我们介绍了如何使用 Docker 部署 Qdrant 向…

Python私有属性和私有方法

私有属性和私有方法 在实际开发中&#xff0c;对象的某些属性或者方法只希望在对象内部被使用&#xff0c;而不希望在外界被访问。 私有属性&#xff1a;对象不希望公开的属性 私有方法&#xff1a;对象不希望公开的方法 定义方式&#xff1a;在属性名或者方法名前添加两个下划…

代理重加密+GO开源代码

目录 一、场景说明 二、代理重加密流程 三、具体原理 本地密钥生成​编辑 加密数据​编辑 生成代理重加密密钥​编辑 密钥代理重加密​编辑 重解密密钥​编辑S X_A 解密数据​编辑 四、开源代码 一、场景说明 一个数据方想要将数据发布到云服务器上进行数据共享&am…

VITIS更新硬件平台

VITIS硬件平台更新以后如何重新导入 在之前建立的硬件平台上右击&#xff0c;选择Update Hardware Specification&#xff0c;选择最新导出的硬件平台文件&#xff1b; 重建板级支持包 选择复位重建BSP源文件&#xff0c;然后Clean&#xff0c;再然后Build 参考连接

前端实例:页面布局2--Tab标签页切换(后端数据实现)

效果 index.php(数据库连接部分不写) <!DOCTYPE html> <html><head><style>.tab_pos {display: flex;justify-content: center;align-items: center;background-color: #fff;}/* 设置标签页外层容器样式 */.tab-container {width: 90%;background-col…