八大算法排序@冒泡排序(C语言版本)

news/2025/3/21 6:19:19/

冒泡排序

概念

  冒泡排序(Bubble Sort)是一种简单直观的排序算法,它重复地遍历待排序序列,一次比较两个相邻的元素,如果它们的顺序错误就将它们交换过来。通过多次的遍历,使得最大的元素逐渐移动到待排序序列的最后,从而实现排序。



算法思想

  主要思路就是比较两个相邻的元素大小,如果顺序错误(与要实现的排序对比而言),则将两个元素交换位置。迭代比对下去,比完一趟后,实现最大的数移动到最后(升序)或最小的数移动到最后(降序),将数组的序列长度减1。
  按照以上的步骤,进行多趟的排序,最终实现数组的排序。我们那实现升序的一趟冒泡排序来进行模拟演变。



示例

如下是数组arr1 = { 6 , 4 , 3 , 9 , 2 , 1 , 5 , 7 , 8 }初始状态下的图文演示:

在这里插入图片描述
变量i存放未排序的第一个元素下标,end存放着数组的个数,数组最后一个元素的下标为end-1。



第一步:

第一步
比较下标 i 和 i+1 相邻两个元素的大小。arr1[i] < arr[i+1]。交换元素的顺序,然后对变量 i 自加1,迭代下去进行下一对的比较。



第二步:

第二步
比较下标 i 和 i+1 相邻两个元素的大小。arr1[i] < arr[i+1]。交换元素的顺序,然后变量 i 自加1,迭代下去进行下一对的比较。


迭代过程就是重复以上的动作。下面是后序的全部过程,如下:
在这里插入图片描述
  第一趟冒泡排序完后,数组中最大的元素9已经被移动到最后,此时对end减1。end从原来的9变为了8。end-1 “指向” 的是下标7。此时可以数组划分为了两个序列,一个是排好序的(下标为8的元素);另一个序列式未排好序的(下标为0 ~ 7的元素)。
(整个数组分为两个序列,前序列是未排好序的,后序列是排好序的。)


一趟冒泡排序排好一个元素,数组中还剩8个未排序的元素,那么只需要再执行七趟冒泡排序,最后当变量 i + 1 等于 end-1 时,判断是否交换arr1[i] 和 arr[i+1],然后整个数组排序完成。最后一个不用排,肯定就是在最左端。




算法实现



// 冒泡排序
void BubbleSort(int* a, int n)
{// 实现代码1int end = n;// 执行n-1趟冒泡排序while (end-1){// 一趟冒泡排序的实现for (int i = 0; i < end - 1; i++){if (a[i] > a[i + 1]){Swap(&a[i], &a[i + 1]);}}end--;} 实现代码2//for (int i = 0; i < n-1; i++)//{//	for (int j = 0; j < n - 1 -i; j++)//	{//		if (a[j] > a[j + 1])//		{//			Swap(&a[j], &a[j + 1]);//		}//	}//}}





时间复杂度

O(N^2)。

计算过程为:

(考虑最坏的情况,如对逆序的数组进行升序的排序)
移动第一个元素时,需要挪动n-1次;
移动第二个元素时,需要挪动n-2次;
...
移动第n-1个元素时,需要挪动1次;
移动第n个元素时,需要挪动0次。挪动的次数是一个公差为1的等差数列,对该数列求和,根据等差数列的前n项和公式求得
Sn=n^2/2;
即时间复杂度为O(n^2/2),又因为时间复杂度不计入系数的。
所以时间复杂度为O(n^2)


空间复杂度

O(1)。

因为是在原数组上进行排序的,没有用到多余的空间,所以空间复杂度为O(1)。




特性总结

1、 冒泡排序是一种非常容易理解的排序
2.、时间复杂度:O(N^2)
3.、空间复杂度:O(1)
4.、稳定性:稳定


http://www.ppmy.cn/news/1290767.html

相关文章

LDD学习笔记 -- Linux内核模块

LDD学习笔记 -- 内核模块 简介LKM类型Static Linux Kernel ModuleDynamic Linux Kernel ModuleLKM编写语法 syntax详细描述内核头文件用户空间头文件Module Initialization FunctionModule Cleanup FunctionKeyword & Tag宏 __init __exitLKM入口注册Module Metadate&#…

C# windows服务程序开机自启动exe程序

我们使用传统的Process.Start(".exe")启动进程会遇到无法打开UI界面的问题&#xff0c;尤其是我们需要进行开启自启动程序设置时出现诸多问题&#xff0c;于是我们就想到采用windows服务开机自启动来创建启动一个新的exe程序&#xff0c;并且是显式运行。 首先是打开…

09、docker 安装nacos并配置mysql存储配置信息

docker 安装nacos并配置mysql存储配置信息 1、docker启动nacos的各种方式2、Docker安装nacos3、MySQL中新建nacos的数据库4、挂载数据or配置目录5、运行 1、docker启动nacos的各种方式 内嵌derby数据源 docker run -d \ -e PREFER_HOST_MODEhostname \ -e SPRING_DATASOURCE_…

CCNP课程实验-04-BGP_CFG

目录 实验条件网络拓朴 基础配置需求实现IGP部分1. 按照图示配置OSPF区域&#xff0c;RID为Loopback 0地址。其中Area 146要配置为OSPF的特殊区域。2. 配置其它路由协议&#xff0c;重分布使得路由互相注入&#xff0c;实现全网互通。3. R1配置策略路由&#xff0c;使得R2经R1去…

一起玩儿物联网人工智能小车(ESP32)——25. 利用超声波传感器测量距离

摘要&#xff1a;本文介绍如何利用超声波传感器测量障碍物的距离 测量距离是智能小车经常要用到的功能&#xff0c;今天就来介绍一个最常用的测量距离的传感器——超声波传感器。 超声波传感器的测距原理是利用超声波发射器向某个方向发射超声波&#xff0c;与此同时&#xff…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)子线程 WorkerThread的实现 和 线程池ThreadPool的初始化

一、子线程 WorkerThread的实现 &#xff08;1&#xff09;工作线程 线程ID&#xff1a;每个线程都有一个唯一的ID,用于标识线程的名字&#xff1a;非必需&#xff0c;主要用于识别线程互斥锁&#xff1a;线程同步条件变量&#xff1a;线程阻塞EventLoop&#xff1a;在每个子…

【JavaFX】JavaFX11开发踩坑记录

文章目录 技术栈踩坑记录 技术栈 JavaFX 11MavenJDK 11 踩坑记录 这些坑对于初学者很容易踩&#xff0c;JavaFX经常会报错空指针异常遇到其中一个问题可能就会消耗好几天的时间。 JavaFX 采用的是MVC架构设计&#xff0c;页面设计使用 fxml文件&#xff1b;业务逻辑采用Con…

Python Web框架FastAPI——一个比Flask和Tornada更高性能的API框架

目录 一、FastAPI框架概述 二、FastAPI与Flask和Tornado的性能对比 1、路由性能 2、请求处理性能 3、内存占用 三、FastAPI的优点与特色 四、代码示例 五、注意事项 六、结论 在当今的软件开发领域&#xff0c;快速、高效地构建API成为了许多项目的关键需求。为了满足…