[ 数据结构 -- 手撕排序算法第二篇 ] 冒泡排序
创始人
2024-04-24 23:55:19
0

文章目录

  • 前言
  • 一、常见的排序算法
  • 二、冒泡排序的实现
    • 2.1 基本思想
    • 2.2 单趟冒泡排序
      • 2.2.1 思路分析
      • 2.2.2 单趟代码实现
  • 三、冒泡排序的实现
  • 五、冒泡排序的时间复杂度
    • 5.1 最坏情况
    • 5.2 最好情况
    • 优化
  • 六、冒泡排序的特性总结
  • 总结


前言

手撕排序算法第一篇:插入排序!
从本篇文章开始,我会介绍并分析常见的几种排序,例如像插入排序,冒泡排序,希尔排序,选择排序,快速排序,堆排序,归并排序等等!
这篇文章我先来给大家手撕一下冒泡排序

大家可以点下面的链接去阅读其他的排序算法:
C语言手撕排序算法


正文开始!

一、常见的排序算法

在这里插入图片描述

冒泡排序属于一种交换排序,因此我们在了解冒泡排序之前,先了解一下交换排序的基本思想。

基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置。
交换排序的特点:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。

二、冒泡排序的实现

2.1 基本思想

冒泡排序是一种简单的交换排序法,其基本思想是:对所有相邻记录的关键字值进行比较,如果是升序(array[j]>array[j+1]),则将其交换,最终达到有序化。

2.2 单趟冒泡排序

2.2.1 思路分析

单趟下来冒泡排序就会把最大的数字放在最后一位(升序)。在这里插入图片描述

2.2.2 单趟代码实现

	for (int j = 0; j < n - 1; j++){if (a[j] > a[j + 1]){Swap(&a[j],&a[j+1]);}}

三、冒泡排序的实现

在单躺的基础下,加上一次大循环。
需要注意的是,每次循环冒出一个数字,因此单趟循环之后到下一次循环中比较次数就要减一,接下来看代码实现。

void Swap(int* x, int* y)
{int tmp = *x;*x = *y;*y = tmp;
}
void BubbleSort(int* a, int n)
{for (int i = 0; i < n; i++){int flag = 0;//flag判断是否是顺序排列,是的话直接就退出for (int j = 0; j < n - 1-i; j++){if (a[j] > a[j + 1]){flag = 1;Swap(&a[j], &a[j + 1]);}}if (flag == 0){break;}}
}
void TestBubbleSort()
{int a[] = { 6,3,1,4,2,5 };printf("排序前:");PrintArray(a, sizeof(a) / sizeof(a[0]));BubbleSort(a, sizeof(a) / sizeof(a[0]));printf("排序后:");PrintArray(a, sizeof(a) / sizeof(a[0]));
}
int main()
{TestBubbleSort();return 0;
}

测试结果:
在这里插入图片描述

五、冒泡排序的时间复杂度

5.1 最坏情况

最坏情况:逆序排顺序。假设有n个数,所以一共交换的次数为1+2+3+…+n
因此最坏的时间复杂度为O(n^2)。

5.2 最好情况

最好情况:有序排有序。对于冒泡排序来说,即使是有序仍然会把每个数进行冒泡。虽然有序,但是冒泡排序不知道呀,还需要继续冒下去。
因此最好的时间复杂度为O(n^2)。

优化

如果前几个已经有序,比较一遍之后后续的无序再进行比较 直接往后走
实现:定义一个flag变量,初始化为0;如果交换就说明变化,将flag变1.没变的话就说明有序,就不用往下走,直接break;

优化后对于最坏情况的时间复杂度是O(n^2);
优化后对于最好情况的时间复杂度是O(n);

六、冒泡排序的特性总结

冒泡排序的特性总结:
1.冒泡排序的思想容易理解。
2.时间复杂度为O(n^2);
3.空间复杂度为O(1);
4.稳定性:稳定


总结

(本章完!)

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...