目录
- 1.简介
- 2.冒泡排序的代码实现以及优化
- 2.1冒泡排序的代码实现
- 2.1代码优化
- 3.冒泡排序的时间复杂度和稳定性
- 3.1冒泡排序的时间复杂度
- 3.2冒泡排序的稳定性
- 4.结语
1.简介
冒泡排序是一种较为简单的排序算法,它又被称为气泡排序或者泡沫排序。它会遍历若干次要排序的数列,每次遍历,它都会从前往后依次比较相邻两数的大小,如果前者比后者大,则它们就会交换位置。这样一次遍历之后,最大的元素就在数列的末尾,再次采用相同的方法,第二大的元素就会被排列在最大的元素之前,以此类推,一直重复这种操作直到整个数列都有序为止。
2.冒泡排序的代码实现以及优化
2.1冒泡排序的代码实现
#include <stdio.h>
int main() {
int i, j;
int a[6] = {20, 40, 30, 10, 60, 50};
// 外层循环控制比较轮数
for (i = 5; i > 0; i--) {
// 内层循环进行相邻元素比较和交换
for (j = 0; j < i; j++) {
// 如果前一个元素大于后一个元素,则进行交换
if (a[j] > a[j+1]) {
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
return 0;
}
它的冒泡排序的过程如下图
我们首先分析第一趟:
当i=5,j=0时,a[0]<a[1],在这个时候我们不做任何处理;
当i=5,j=1时,a[1]>a[2],此时交换a[1]和a[2]的值,交换之后a[1]=30,a[2]=40;
当i=5,j=2时,a[2]>a[3],此时交换a[2]和a[3]的值,交换之后a[2]=10,a[3]=40;
当i=5,j=3时,a[3]>a[4],此时不做任何处理;
当i=5,j=2时,a[4]>a[5],此时交换a[4]和a[5]的值,交换之后a[4]=50,a[5]=60;
当我们第一趟排完之后,数列{20, 40, 30, 10, 60, 50}就变成了{20, 30, 10, 40, 50, 60} 我们根据这种方法:第二趟排完之后数列a[5~6]是有序的
第三趟排完之后数列a[4~6]是有序的
第四趟排完之后数列a[3~6]是有序的
第五趟排完之后整个数列就有序了
2.1代码优化
我们如果仔细观察上面的代码,可以发现在拍完第三趟之后,数据已经是有序的了,第四趟和第五趟并没有进行数据交换,因此我们可以对这个冒泡排序的代码进行一个小小的优化,使它的效率更高一些。
我们可以添加一个标记,如果在一趟遍历中发生了交换,标记为0,如果没有发生交换则标记为1
以下是优化后的代码
#include <stdio.h>
int main() {
int i, j;
int a[6] = {20, 40, 30, 10, 60, 50};
int flag = 0; // 标志变量,用于表示是否发生了交换
// 外层循环控制比较轮数
for (i = 5; i > 0; i--) {
// 内层循环进行相邻元素比较和交换
for (j = 0; j < i; j++) {
// 如果前一个元素大于后一个元素,则进行交换
if (a[j] > a[j + 1]) {
int temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
flag = 1; // 标记发生了交换
}
}
if (!flag) {
break; // 如果发生了交换,则提前结束外层循环
}
}
return 0;
}
3.冒泡排序的时间复杂度和稳定性
3.1冒泡排序的时间复杂度
冒泡排序的时间复杂度是O(N2),假设我们要排序的数列中有N个数,遍历一趟的时间复杂度是O(N),那么我们需要遍历多少次呢?我们可以想一下,当我们遍历到第N-1次的时候,第一个已经是最小的了,所以冒泡排序的时间复杂度是O(N2).
3.2冒泡排序的稳定性
冒泡排序是一个稳定的算法,因为它满足 稳定算法的定义。
4.结语
大家好,我是一名刚开始学C语言的小白,也是刚开始接触博客这个东西,也没有太大的经验,我发的文章也算不上什么专业的教程,只是和大家分享我所学的知识,如果在看这篇文章的你也是刚开始想要学习算法的小白,我们可以一起学习一起进步,我会每隔两三天更新一篇文章,如果有刚开始学习算法的小白,可以订阅我的专栏,我写的这些是根据自己的理解写的,可能有些说的不太对的地方,希望大家指正,有什么意见或者问题也可以在评论区提出来,我会认真的一条一条认真回复大家的,希望大家点点赞点点关注,今天的分享就到这里了,谢谢大家的阅读