冒泡排序
描述
冒泡排序是比较简单的排序,
首先,顾名思义,“冒泡”意味着你想要的数据像泡泡一样咕嘟咕嘟冒出来,并且,在冒出水面的过程中,泡泡是逐渐浮到水面的。
这也就意味着,该数据走过了全部数据长度的距离,那,它代表了这个排序算法的时间复杂度肯定比较大,但是胜在稳定。
理解
假设有 n 个数据要进行排序;
那么我们就需要进行 n-1 趟排序;
例如:我们对 6 个数据进行排序:
第一趟:将最大的值冒出来:(n = 6)
5与6相比,<,不变;
6与8相比,<,不变;
8与2相比,>,交换;
8与1相比,>,交换;
8与9相比,<,不变。
第二趟:将第二大的值冒出来:(n = 6)
5与6相比,<,不变;
6与2相比,>,交换;
6与1相比,>,交换;
6与8相比,<,不变。
第三趟:将第三大的值冒出来:(n = 6)
5与2相比,>,交换;
5与1相比,>,交换;
5与6相比,<,不变。
第四趟:将第四大的值冒出来:(n = 6)
2与1相比,>,交换;
2与5相比,<,不变。
第五趟:将第五大的值冒出来:(n = 6)
1与2相比,<,不变。
总结规律
从上面的例子我们可以看出:
- 对于 n 个数据来说,需要 n-1 趟排序;
- 第 t 趟排序中,需要 n-t 次比较;
代码实现
#include <stdio.h>
void Swap(int *a, int *b)
{
int tmp = *a;
*a = *b;
*b = tmp;
}
void Bubble(int *arr, int len)
{
for(int i = 0; i < len-1; i++) // 控制外层循环趟数
{
for(int j = 0; j < len-1-i; j ++)// 控制内层比较次数
{
if(arr[j] > arr[j+1])
{
Swap(&arr[j], &arr[j+1]);// 交换
}
}
}
}
int main()
{
const int n = 6;
int arr[n] = {5,6,8,2,1,9};
Bubble(arr,n);
for(int i = 0; i < n; i ++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}
算法分析
- 时间复杂度:O(n^2);
- 空间复杂度:O(1);
- 稳定性:稳定。