一、概念及原理
冒泡排序:通过两两比较相邻元素,如果发生逆序,则进行交换,从而使大的元素像气泡一样逐渐往上“”“漂浮”。
二、使用说明
1.时间复杂度
最好情况下:只需要进行一次排序,在排序过程中进行 n-1 次元素间的比较,且不移动记录。
最坏情况下:需要进行 n-1 次排序,总的元素比较次数和记录移动次数分别为n^2/2 ,3*n^2/2。
在平均情况下,冒泡排序元素的比较次数和记录移动次数分别为n^2/4 和3n2/4,时间复杂度为O(n2)。
2.空间复杂度
冒泡排序只有在两个元素交换位置时,需要一个辅助空间用做暂存记录,所以空间复杂度为O(1)。
3.算法特点
- 稳定排序
- 可用于链式存储结构
- 移动记录次数较多,算法的平均时间性能比直接插入排序差。当初始无序、n较大时,不宜采用冒泡排序。
4.动画展示
三、双循环实现代码演示
#include <stdio.h>
#include <stdlib.h>
void bubblingSort(int* array, int len)
{
int iFlag = 0; //标志位(算是一点性能优化)
int i = 0, j = 0; //定义循环因子
int temp = 0; //临时变量
for (i = len-1; i > 0; i--) //该层循环控制需要排序多少次
{
iFlag = 0;
for (j = 0; j<i; j++) //该层循环控制,从0到i的至简元素进行比较,满足条件就交换
{ //注意此时不需要管已经排序好的数据
if (array[j] > array[j + 1])
{
temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
iFlag = 1; //该条件放置的位置,思考一下放在if里面,还是if外面for里面
}
}
if (iFlag == 0) //控制到条件,也就是说在一次循环里没有进行元素的交换,就表明排序完成
{
return;
}
}
}
void printArray(int* array, int len)
{
for (int i = 0; i < len; ++i)
{
printf("%4d", array[i]);
}
}
int main(void)
{
int array[10] = { 78,15,99,53,84,27,39,1,41,67 };
int len = sizeof(array) / sizeof(int);
//输出排序前的数组
printf("排序前的数组\n");
printArray(array, len);
putchar('\n');
//调用冒泡排序函数排序
bubblingSort(array, len);
//输出排序后的数组
printf("排序后的数组\n");
printArray(array, len);
putchar('\n');
system("pause > 0");
return 0;
}
代码运行结果如下:
四、递归实现代码演示
#include <stdio.h>
#include <stdlib.h>
void recursionBubblingSort(int* array, int len)
{
if (len == 0) //递归的出口
{
return;
}
int i = 0; //循环因子
int temp = 0; //临时变量
int iFlag=0;
for (i = 0; i < len - 1; ++i) //该层循环是为了找出数组中最大的数
{
if (array[i] > array[i + 1])
{
int temp;
temp = array[i];
array[i] = array[i + 1];
array[i + 1] = temp;
iFlag = 1;
}
}
if (iFlag == 0) //控制到条件,也就是说在一次循环里没有进行元素的交换,就表明排序完成
{
return;
}
recursionBubblingSort(array, len - 1); //递归是为了循环找出剩下数中最大的数
}
void printArray(int* array, int len)
{
for (int i = 0; i < len; ++i)
{
printf("%4d", array[i]);
}
}
int main(void)
{
int array[10] = { 78,15,99,53,84,27,39,1,41,67 };
int len = sizeof(array) / sizeof(int);
//输出排序前的数组
printf("排序前的数组\n");
printArray(array, len);
putchar('\n');
//调用递归冒泡排序函数排序
recursionBubblingSort(array, len);
//输出排序后的数组
printf("排序后的数组\n");
printArray(array, len);
putchar('\n');
system("pause > 0");
return 0;
}
代码运行结果如下:
动画来源:https://www.cnblogs.com/xaimicom/p/9189471.html