1.冒泡排序的原理:
现在有一组数列:5 2 8 1 7 4 3 10 6 9
要使这10个无序排列的元素通过冒泡排序的方法实现从小到大排列,原理是从左往右依次比较相邻两个元素,如果左边的数比右边的数小则是顺序,不用做任何调整,如果左边的数比右边的数大则是逆序,需要交换两个数的位置,之后往右进行下一对相邻元素的比较。比如上面一开始是相邻的5和2进行比较,左边的5比右边的2大,则交换两个数的位置,变成2和5,接着往右进行下一对相邻元素比较的是5和8,5比8小不需要交换两个数的位置,直接往右进行下一对相邻元素的比较,这样依次往右进行相邻元素的比较,直到最后一对相邻元素比较完毕。这称之为一趟冒泡排序,这样会使这组数列中最大的数到达最后,之后排在第10位的数字不动,接着进行前面9个数字的比较,重复上面的步骤,直至这组数列的最前面一对相邻元素进行最后一趟冒泡排序,数列变成顺序排列,这样的排序方法称之为冒泡排序。
图示原理:
一趟冒泡排序使得数列中最大的数到达了最右边(排在第10位),不动这个最大的数,紧接着进行下一趟冒泡排序,对前面剩下的9个数进行第二趟冒泡排序,让这9个数中的最大值到达最后(排在第9位),重复上述步骤,直至整个数列呈现顺序排列。图示原理:
由图可看出实际只需要进行九趟冒泡排序即可将数列变成顺序排列。
2.冒泡排序的C编程实现:
在C语言中用数组来存放多个整数,我们编写一个函数来实现冒泡排序:
//定义一个函数用来实现冒泡排序算法
void bubble_sort(int arr[],int sz)
{
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
}
这个函数中需要注意的是循环条件要怎么写,因为第一趟冒泡需要进行9次相邻元素的比较,第二趟冒泡排序,需要进行8次冒泡排序,依次往下,直到第九趟冒泡排序,进行1次冒泡排序后,整个数组呈现顺序排列。所以外层循环控制要进行几趟冒泡排序,内层循环要控制一趟冒泡排序中需要进行多少次相邻元素的比较,这里内层循环中的循环判断条件是j<sz-1-i是因为一趟冒泡排序会使数组中最大的数到达最右边,而后进行下一趟冒泡排序时,排在最右边的数相较于前面已经是最大的数,前面的数就不需要再和最右面的元素进行比较,因而每一趟下来,就会减少一次相邻元素的比较。又因为i在每轮循环后会加1,则sz-1-i就会减小,所以构造的循环判断条件既是如此。(这里要注意数组的下标是从0开始)
在主函数中调用bubble_sort函数实现一个数组元素的冒泡排序:
#include<stdio.h>
int main()
{
int arr[10] = { 0 };
int sz = sizeof(arr) / sizeof(arr[0]); //数组元素个数
int n = 0;
for (n = 0; n < sz; n++) //用来输入数组元素
{
scanf("%d", &arr[n]);
}
bubble_sort(arr, sz);
int i = 0;
for (i = 0; i < sz; i++) //用来打印数组元素
{
printf("%d ", arr[i]);
}
return 0;
}
程序运行结果:
但是这个程序还不够完善,在上述冒泡序中也许在进行完某趟冒泡排序后(还没有到最后一趟冒泡排序),数组其实就已经达到了顺序排列,而后再进行下一趟冒泡排序时还要进行相邻元素的比较,这样效率就不够高,改进该函数使冒泡排序的效率提高:
void bubble_sort(int arr[],int sz)
{
int count = 0; //用来统计比较次数
int i = 0;
for (i = 0; i < sz - 1; i++)
{
int flag = 1; //定义一个变量用来观测数组是否已经达到了顺序排列
int j = 0;
for (j = 0; j < sz - 1 - i; j++)
{
if (arr[j] > arr[j + 1])
{
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
flag = 0;
}
count++;
}
if (flag == 1)
{
break;
}
}
printf("比较了%d次\n",count);
}
上面用flag变量来监测数组,如果在一趟冒泡排序中没有发生元素的交换,说明已经达到了顺序排列,就不需要再进行下一趟冒泡排序,直接跳出循环。再用一个count变量来记录数组中两两相邻元素比较了多少次,来看看效率是否提高了。
程序运行结果:
由图可知,顺序排列的数组元素,只需要进行9次相邻元素的比较即可,效率确实提高了。
如果文章还有哪些不足,欢迎小伙伴们评论留言。下面是冒泡排序的程序代码,有兴趣的小伙伴可以下载了解。
Bubble_Sort/Bubble_Sort/bubble_sort.c · 俺叫熊二/米饭工厂 - Gitee.com