赞
踩
要使这10个无序排列的元素通过冒泡排序的方法实现从小到大排列,原理是从左往右依次比较相邻两个元素,如果左边的数比右边的数小则是顺序,不用做任何调整,如果左边的数比右边的数大则是逆序,需要交换两个数的位置,之后往右进行下一对相邻元素的比较。比如上面一开始是相邻的5和2进行比较,左边的5比右边的2大,则交换两个数的位置,变成2和5,接着往右进行下一对相邻元素比较的是5和8,5比8小不需要交换两个数的位置,直接往右进行下一对相邻元素的比较,这样依次往右进行相邻元素的比较,直到最后一对相邻元素比较完毕。这称之为一趟冒泡排序,这样会使这组数列中最大的数到达最后,之后排在第10位的数字不动,接着进行前面9个数字的比较,重复上面的步骤,直至这组数列的最前面一对相邻元素进行最后一趟冒泡排序,数列变成顺序排列,这样的排序方法称之为冒泡排序。
图示原理:
在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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。