冒泡排序法的基本思想如下:
(1)对数组中的各数据,依次比较相邻的两个元素的大小。
(2)如果前面的数据大于后面的数据,就交换这两个数据。经过第一轮的多次比较排序后,便可把最小的数据排好。
(3)用同样的方法把剩下的数据逐个进行比较,最后便可按照从小到大的顺序排好数组中各数据的顺序。
此排序法就像气泡在水中向上浮一样,所以也称为气泡排序法。
下面以一组待排序的数据演示冒泡排序的过程,假设有6个需要排序的数据序列如下:69,65,90,37,92,6
详细C代码如下:
#include<stdio.h>
#include "9_20Rand.c"
#define ARRAYLEN 6
void BubbleSort(int a[], int n)
{
int i, j, tmp;
for(i = 0; i < n - 1; i++)
{
for(j = 0; j < n - i - 1; j++)
{
if(a[j] < a[j + 1])
{
tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
}
}
printf("第%2d遍:", i + 1);
for(j = 0; j < n; j++)
printf("%d ", a[j]);
printf("\n");
}
}
int main()
{
int i, a[ARRAYLEN];
for(i = 0; i < ARRAYLEN; i++)
a[i] = 0;
if(!CreateData(a, ARRAYLEN, 1, 100))
{
printf("生成随机数不成功!\n");
getch();
return 1;
}
printf("原始数据:");
for(i = 0; i < ARRAYLEN; i++)
printf("%d ", a[i]);
printf("\n");
BubbleSort(a, ARRAYLEN);
printf("排序后:");
for(i = 0; i < ARRAYLEN; i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}
我的运行结果如下:
但这还没完,我们还可以对冒泡排序法进行优化,例如,如果本来就是有顺序的数据,也需要进行n-1次比较。这就造成了冒泡排序法的算法虽然简单,但效率较差。
代码中增加一个标志位,用来标记有顺序而不需要再排序的数组
在扫描数据过程中, 若有数据交换,则设置其值为1。在一遍扫描完成之后,判断flag的值,若其值为0,表示在这一遍扫描中已经没有数据进行交换,数据已经按顺序排列,就不需要再进行后续的扫描了。
详细C代码如下:
#include<stdio.h>
#include "9_20Rand.c"
#define ARRAYLEN 6
void BubbleSort(int a[], int n)
{
int flag = 0;
int i, j, tmp;
for(i = 0; i < n - 1; i++)
{
for(j = 0; j < n - i - 1; j++)
{
if(a[j] < a[j + 1])
{
tmp = a[j];
a[j] = a[j + 1];
a[j + 1] = tmp;
flag = 1;
}
}
printf("第%2d遍:", i + 1);
for(j = 0; j < n; j++)
printf("%d ", a[j]);
printf("\n");
if(flag == 0)
break;
else
flag = 0;
}
}
int main()
{
int i, a[ARRAYLEN];
for(i = 0; i < ARRAYLEN; i++)
a[i] = 0;
if(!CreateData(a, ARRAYLEN, 1, 100))
{
printf("生成随机数不成功!\n");
getch();
return 1;
}
printf("原始数据:");
for(i = 0; i < ARRAYLEN; i++)
printf("%d ", a[i]);
printf("\n");
BubbleSort(a, ARRAYLEN);
printf("排序后:");
for(i = 0; i < ARRAYLEN; i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}
我的运行结果如下:
很明显我们可以减少遍历的次数,进而提高运算效率,节约了运行时间