十大排序之:冒泡排序

news2025/1/4 17:39:21

目录

一、简介

实现过程 

时间复杂度

二、代码实现

函数声明

Swap函数 

单趟

多趟

测试 

优化 


一、简介

冒泡排序是一种简单的排序算法,它重复地比较相邻的两个元素,如果顺序错误就交换它们,直到没有元素需要交换为止。这个过程类似于气泡在水中上升的过程,因此被称为冒泡排序。

 

实现过程 

下面是冒泡排序的实现过程:

  1. 从待排序的数组中的第一个元素开始,依次比较相邻的两个元素。
  2. 如果前一个元素大于后一个元素,则交换它们的位置。
  3. 继续比较下一对相邻元素,直到比较到数组的最后一个元素。
  4. 重复以上步骤,每次比较的元素个数减少一位,直到最后一个元素。
  5. 重复以上步骤,直到所有元素都按照从小到大的顺序排列。

时间复杂度

 冒泡排序的时间复杂度是O(n^2),其中n是待排序数组的长度。由于每次排序都会比较相邻的两个元素,因此需要进行n-1次比较。而每次比较都有可能进行元素交换,最坏情况下需要进行n-1次交换。因此,总的比较和交换次数都是(n-1)+(n-2)+(n-3)+...+1 = n*(n-1)/2(等差数列求和公式),即O(n^2)。

 

二、代码实现

思想随易,实现不易,接下来是冒泡排序的代码实现(以C语言为例)。

函数声明

void BubbleSort(int* a, int n);//接收一个数组,作为参数

 

Swap函数 

冒泡排序是一种交换排序,每次比较两个数,如果符合条件(大泡泡在前,小泡泡在后),则会发生位置的交换。我们先实现一个能完成两个数交换的函数Swap

Swap
功能:能实现两个数的交换
void Swap(int* pa, int* pb)
{
	int tmp = *pa;
	*pa = *pb;
	*pb = tmp;
}

 

单趟

我们先来完成一趟冒泡排序过程的代码:

假设有10个数,下标为0~9,在第一趟冒泡排序的过程中,要比较的下标为(0,1),(1,2),(2,3),... (8,9)。我们用for循环产生每对下标的前一个(或后一个)(以前一个为例),记为i,那么i的最大下标为n-2(n为数组元素个数)。因此,控制循环结束的条件为i<n-1(或i<=n-2)。

void BubbleSort(int* a, int n)
{
     //单趟(第一趟)排序的过程
     for (int i = 0; i < n - 1; i++)
    {
        //前一个泡泡大,则换到后一个位置
	    if (a[i] > a[i + 1])
	    {
		Swap(&a[i], &a[i + 1]);
	    }
    }
}

多趟

但是,以上的一趟排序只是把最大的数换到了最后,只解决了一个数的排序。因此,我们需要进行多趟的排序。假设有10(n)个数,我们只需要进行9(n-1)趟的排序,9个数到了他们正确的位置,那么余下的一个数也找到了他的位置。把趟数用j作为标记,把循环次数控制为n-1

void BubbleSort(int* a, int n)
{
    //j为趟数
	for (int j = 0; j < n - 1; j++)
	{
		//单趟排序(第一趟)的过程
		for (int i = 0; i < n - 1; i++)
		{
            //前一个泡泡大,则换到后一个位置
			if (a[i] > a[i + 1])
			{
				Swap(&a[i], &a[i + 1]);
			}
		}
	}
}

 0~n-2,循环次数为n-1。

那么,我们把第一趟的单趟冒泡排序走完后,完成了一个数的排序,把最大的数,放在了n-1,数组中最后一个下标的位置。接下来,第二趟的排序,我们要完成的是n-1个数的排序,最后一个位置的坐标为n-2,最后完成比较的那一对坐标为(n-3, n-2),所以i最大为n-3。单趟排序的代码需做些修改,使第j趟的排序,与i能够对应上。

void BubbleSort(int* a, int n)
{
	for (int j = 0; j < n - 1; j++)
	{
		//单趟排序(第j趟)的过程
		for (int i = 0; i < n - 1 - j; i++)
		{
			if (a[i] > a[i + 1])
			{
				Swap(&a[i], &a[i + 1]);
			}
		}
	}
}

我们把i控制为 i < n-1-j:

第一趟:j = 0,i < n-1-0,即 i < n - 1, i最大为n-2。

第二趟:j = 1,i < n-1-1,即 i < n - 2, i最大为n-3。

。。。

符合条件!

测试 

以上,就完成了冒泡排序的代码。

做些小小的测试:

执行完BubbleSort后,数组变为了有序,成功!

优化 

最后给出一个优化版本:

//冒泡
void BubbleSort(int* a, int n)
{
	for (int j = 0; j < n - 1; j++)
	{
        //假设数组已经有序
		int flag = 1;
		//单趟排序(第j趟)的过程
		for (int i = 0; i < n - 1 - j; i++)
		{
			if (a[i] > a[i + 1])
			{
				Swap(&a[i], &a[i + 1]);
				flag = 0;//数据发生了交换,假设错误
			}
		}
		//这趟排序无任何数据发生交换,数组已然有序
		if (flag == 1)
		{
			break;
		}
	}
}

冒泡排序如果在进行某趟排序后,就已经有序了,我们再进行一趟排序后,发现无任何数据发生交换,就不然其进行下一趟的排序,直接跳出循环。 

 

以上为冒泡排序内容介绍,感谢各位读者三连支持!

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

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

相关文章

Python | Leetcode Python题解之第414题第三大的数

题目&#xff1a; 题解&#xff1a; class Solution:def thirdMax(self, nums: List[int]) -> int:a, b, c None, None, Nonefor num in nums:if a is None or num > a:a, b, c num, a, belif a > num and (b is None or num > b):b, c num, belif b is not No…

Cpp快速入门语法(下)(2)

文章目录 前言一、函数重载概念与使用C为何支持函数重载&#xff1f; 二、引用概念语法特性权限(常引用)使用场景与指针的区别 三、内联函数四、auto关键字(C11)五、基于范围的for循环(C11)六、指针空值nullptr(C11)总结 前言 承前启后&#xff0c;正文开始&#xff01; 一、函…

C++ | Leetcode C++题解之第414题第三大的数

题目&#xff1a; 题解&#xff1a; class Solution { public:int thirdMax(vector<int> &nums) {int *a nullptr, *b nullptr, *c nullptr;for (int &num : nums) {if (a nullptr || num > *a) {c b;b a;a &num;} else if (*a > num &&am…

一般在写SQL时需要注意哪些问题,可以提高查询的效率?

很多人写SQL按照自己喜好&#xff0c;没有规则意识&#xff0c;这对于自主查询影响不大&#xff0c;你爱怎么搞就怎么搞&#xff0c;一旦涉及到提交任务或团队共享&#xff0c;就不能乱写了&#xff0c;会浪费资源影响到开发效率&#xff0c;严重的甚至会服务器瘫痪。 提几个关…

深度学习之图像数据集增强(Data Augmentation)

文章目录 一、 数据增强概述二、python实现传统数据增强参考文献 一、 数据增强概述 数据增强&#xff08;Data Augmentation&#xff09;是一种技术&#xff0c;通过对现有数据进行各种变换和处理来生成新的训练样本&#xff0c;从而增加数据集的多样性和数量。这些变换可以是…

dubbo三

dubbo dubbo架构各层说明 URL举例解析 消费者引用服务过程 项目初始化

世界排名第一的数码照片和图形放大软件PhotoZoom Pro 9

BenVista PhotoZoom Pro 9 是世界排名第一的数码照片和图形放大和缩小软件解决方案。 PhotoZoom Pro 9 配备了我们全新的 S-Spline Max AI 图像调整大小技术&#xff0c;可产生比以往任何时候都更高质量的图像放大。 您所要做的就是指定您想要的图像大小&#xff0c;它实际上是…

【3D打印】使用simplify 3D切片更改Gcode手动断电续打、掉电、未打完继续打印、补救

一、问题描述 有些时候会遇到3D打印机没料但机器还在继续打、掉电重启后未正常恢复打印、挤出机端没有料但断料检测未触发等情况。我们又不想打印放弃&#xff0c;但又想继续之前的进度打印。 这时候我们需要更改3D打印文件的Gcode参数来进行继续打印。 至于什么是Gcode&…

电磁阀,线性电磁阀信号驱动隔离变送器

电磁阀,线性电磁阀信号驱动隔离变送器 定义:用模拟信号控制电磁阀门开关驱动的信号隔离产品,广泛用于流量控制,加料控制. 电磁阀开驱动隔离变送器为一进一出系列,型号是:JSD TAP-1001系列 该电磁阀驱动设备具有以下特点:特征&#xff1a; ◆低成本,PA66阻燃外壳,国际标准DIN35导…

程序设计题(41-48)

第四十一题 题目 #include <stdio.h> #include <math.h> double fun(double x , int n) {}main() { void NONO ();printf("%f\n", fun(0.3,10));NONO();getchar(); }void NONO () {/* 本函数用于打开文件&#xff0c;输入数据&#xff0c;调用函数&am…

防火墙——NAT

目录 NAT NAT分类 旧分类 新分类 NAT配置 源NAT​编辑 配置源NAT地址池​编辑 关于源NAT环路问题 环境如下​编辑 防火墙nat​编辑​编辑 路由器要配置指向11.0.0.0 网段的静态路由​编辑 测试​编辑 如果此时有外网用户直接pingNAT地址&#xff0c;则环路出现。​…

【手撕算法】快速排序(递归分治法)Python实现

一、算法 class Solution:def Partition(self, nums, low, high):pivotkey nums[low] # 元素copied, nums[low]空了出来while low < high:while low < high and nums[high] > pivotkey:high high - 1 # 直到找到一个nums[high]<pivotkey位置nums[low] nums[h…

【C语言】联合体枚举的讲解

目录 ✨声明&#xff01;&#xff01;&#xff01;&#xff1a; 联合体与结构体只有一个区别&#xff0c;那就是内存存储方式不同 &#x1f495;1.联合体的声明 &#x1f495;2.联合体内存的存储 &#x1f495;3.联合体字节大小的计算 例题2&#xff1a; ✨4.枚举的声明…

2024最新股票系统源码 附教程

1.环境 环境 php7.4 sql 5.7 Nginx1.2 tomcat-8 redis 放行1-65535 2.创建5个网站。xxx.com替换你的域名 ftp.xxx.com api.xxx.com agent.xxx.com admin.xxx.com wap.xxx.com api设置反向代理 代理名称 api 目标URL http://127.0.0.1:8091 新建ftp 目录指向新建的…

绝缘子缺陷检测数据集

绝缘子缺陷检测数据集&#xff0c;2800张高清照片&#xff0c;已打好标签txt格式&#xff0c;可直接进行目标检测。7类标签&#xff1a;玻璃绝缘子&#xff0c;玻璃片脏污&#xff0c;玻璃片缺损&#xff0c;聚合物片脏污&#xff0c;聚合物片缺损&#xff0c;聚合物绝缘子&…

K8S - Access Control 机制介绍

作为开发人员&#xff0c; 我们通常会直接用root 帐号操作 k8s master node 里的kubectl 命令&#xff0c;并不能感知k8s 多用户权限管理存在。 即使自动化&#xff0c; 我们也会考虑用ansible 来远程操作master node… 所以大部分开发人员默认上是不用深入研究k8s的Access c…

Qt优秀开源项目之二十三:QSimpleUpdater

QSimpleUpdater是开源的自动升级模块&#xff0c;用于检测、下载和安装更新。 github地址&#xff1a;https://github.com/alex-spataru/QSimpleUpdater QSimpleUpdater目前Star不多&#xff08;911个&#xff09;&#xff0c;但已在很多开源项目看到其身影&#xff0c;比如Not…

[数据结构]算法复杂度详解

文章目录 一、引言1、想象数据结构与算法的奇妙世界2、算法复杂度的轻松解读3、数据结构与算法的温馨寄语 二、轻松掌握复杂度基础1、时间复杂度&#xff1a;算法速度的衡量尺2、空间复杂度&#xff1a;算法占地的衡量尺3、常见的复杂度 三、复杂度的计算1、时间复杂度计算2、空…

联想键盘鼠标套装Liteon SK-8861 银丝带键盘、鼠标对码方法

知识点分析: 最近在IdeaCentre B520e、IdeaCentre A720等机型&#xff0c;标配2.4G无线键鼠套装&#xff1a;Liteon SK-8861。由三部分组成&#xff1a;USB接收器、鼠标、键盘。鼠标、键盘同时和USB接收器连接&#xff0c;未开箱时USB接收器包装在鼠标内。标配的键鼠套装不需要…

linux 内核代码学习(九)--Linux内核启动和文件系统

一个比较顺手的学习平台可以达到事半功倍的效果&#xff0c;这里使用的平台环境主要是利用了主机和从机间的文件共享&#xff0c;以及从机自带的编译环境可以比较顺利的编译busybox1.0版本&#xff0c;方便进行内核和文件系统的测试了学习。 主机环境&#xff1a;vmware7.0win1…