【算法基础】冒泡排序解析

news/2024/12/13 4:52:05/

作者:柒号华仔
个人主页:欢迎访问我的主页
个人信条:星光不问赶路人,岁月不负有心人。
个人方向:专注于5G领域,同时兼顾其他网络协议,编解码协议,C/C++,linux等,感兴趣的小伙伴可以关注我,一起交流。


目录

    • 1. 冒泡排序介绍
      • 1.1 定义
      • 1.2 基本原理
      • 1.3 时间复杂度
      • 1.5 优缺点
    • 2. 代码实现
      • 2.1 代码设计
      • 2.2 代码实现

1. 冒泡排序介绍

1.1 定义

在我们日常喝可乐雪碧的过程中,会看见无数气泡向水面移动,直到冒出水面,气泡比水轻会向前移动,我们称这种现象为冒泡。在我们数组排序中,每一个数组元素根据大小比对,小的元素不断向前移动,如同气泡在冒出一样,我们称这种排序方法为冒泡排序。

冒泡排序重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

1.2 基本原理

冒泡的原理如下:

  1. 比较相邻的两个元素,如果第一个比第二个大,就两者进行交换,如果第一个比第二个小,则保持顺序不变。
  2. 对数组中的每一对相邻元素依次做上面的比对和交换工作,这样最大的数就移到了最后。
  3. 一轮完毕后,继续重复步骤1和步骤2的操作,直到没有任何一对数字需要比较,最后便得到了依次排序好的数组。

下面的动图非常清晰的诠释了冒泡排序的过程:

在这里插入图片描述

1.3 时间复杂度

如果数组是正序排列的,一轮比对即可完成排序,此时时间复杂度为O(n);

如果数组是完全倒序的,需要进行n-1轮排序,每一轮要进行n-i次比对。这里的i是已经比对的轮次数,也是数组末尾已经排序好元素个数。总的比对次数为:
(n-1)+(n-2)+…+1=n*(n-1)/2
此时时间复杂度为O(n2n^2n2);

因此,冒泡排序的平均时间复杂度为O(n2n^2n2) 。

1.5 优缺点

优点:冒泡排序算法简单,稳定可靠。

缺点:当数据量庞大并且乱序严重时,比较次数多,排序效率低。

2. 代码实现

2.1 代码设计

a. 实现冒泡排序需要设计两层循环,外循环为总的比对轮次,内循环为未排列好的元素;

b. 取出待比对元素array[i],将其与array[i+1]进行比对,若前者比后者大,则进行交换,否则不进行交换。

c. 依次重复向后比对,直至这一轮比对交换完,再从头进行下一轮。

d. 总共进行size轮比对,排序完成

2.2 代码实现

#include <stdio.h>void printArray(int array[], int size) {int i;for (i = 0; i < size; i++) {printf("%d ", array[i]);}printf("\n");
}void bubble_sort(int array[],int size){int temp,i,j;for(i = 0;i < size-1;i++){for (j = 0;j < size-1-i;j++){if (array[j] > array[j+1]) {temp = array[j];array[j] = array[j+1];array[j+1] = temp;}}}
}
int main(){int array[] = {3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};bubble_sort(array,sizeof(array)/sizeof(int));printArray(array,sizeof(array)/sizeof(int));return 0;
}

运行结果:
在这里插入图片描述


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

相关文章

【C语言】详细介绍qsort和模拟实现qsort

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;凡人修C传 &#x1f4ac;总结&#xff1a;希望你看完之后&…

【TypeScript】TS 看这一篇就够了

文章目录&#x1f9d1;‍&#x1f4bb;TypeScript基本概念TypeScript 是什么&#xff1f;为什么要有typescript安装编译 TS 的工具包编译并运行 TS 代码创建基于TS的vue项目&#x1f9d1;‍&#x1f4bb;TypeScript基础类型注解TypeScript类型概述TypeScript原始数据类型数组类…

SSM整合配置

SSM整合配置1. module结构2. pom.xml3. resources3.1 jdbc.properties&#xff1a;4. config4.1 SpringConfig&#xff1a;4.2 JdbcConfig&#xff1a;4.3 MybatisConfig&#xff1a;4.4 SpringMvcConfig&#xff1a;4.5 ServletInitializer&#xff1a;★1. module结构 SSM整…

【数据结构基础】图 - 最小生成树(Prim Kruskal)

Kruskal算法是从最小权重边着手&#xff0c;将森林里的树逐渐合并&#xff1b;prim算法是从顶点出发&#xff0c;在根结点的基础上建起一棵树。最小生成树相关名词连通图: 在无向图中&#xff0c;若任意两个顶点vivi与vjvj都有路径相通&#xff0c;则称该无向图为连通图。强连通…

【Web开发】Python实现Web服务器(CentOS下运行Flask)

文章目录1、简介2、安装2.1 安装Centos2.2 安装python2.3 安装虚拟环境2.4 修改国内源2.5 安装flask库3、测试3.1 flask官方例子结语1、简介 CentOS 大家应该很熟悉了&#xff0c;英文全称&#xff1a;Community Enterprise Operating System&#xff08;社区企业操作系统&…

Spring Cloud Gateway源码

文章目录一、背景1. 核心概念2. 工作流程3.动态路由二、自动配置源码解析1.GatewayAutoConfiguration2.WebFluxAutoConfiguration3.HttpHandlerAutoConfiguration三、请求过程源码解析1. 整体流程2. NettyWebServer接收http请求3.请求和响应转换4.HttpWebHandlerAdapter5. Exce…

怎么使用【Davinci Cfg】配置CanNM Bus load reduction功能

文章目录 1 涉及的模块2 配置的参数传送门 ==>> AutoSAR入门和实战系列总目录 1 涉及的模块 配置CanNM Bus load reduction功能要用到NM和CanNM模块,NM是抽象出来的,它独立于使用的具体总线,CanNM是CAN总线的NM. 2 配置的参数 要配置使用某个通道的Bus load reduc…

C++之生产者和消费者模型分析(条件变量)

先看一下生产者消费者模型概述&#xff1a;生产者把需要处理的数据放到缓存队列中并向消费者发出信号&#xff0c;然后消费者把数据拿出来处理&#xff0c;这里生产者可以是单线程或者多线程&#xff0c;而消费者一般是多线程&#xff0c;消费者线程集合也称线程池。下面再举一…