当前位置:   article > 正文

C语言冒泡排序_编写一个函数对给定数组arr[ ]和元素个数n按升序进行冒泡排序,在主函数中调用。

编写一个函数对给定数组arr[ ]和元素个数n按升序进行冒泡排序,在主函数中调用。

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语言中用数组来存放多个整数,我们编写一个函数来实现冒泡排序:

  1. //定义一个函数用来实现冒泡排序算法
  2. void bubble_sort(int arr[],int sz)
  3. {
  4. int i = 0;
  5. for (i = 0; i < sz - 1; i++)
  6. {
  7. int j = 0;
  8. for (j = 0; j < sz - 1 - i; j++)
  9. {
  10. if (arr[j] > arr[j + 1])
  11. {
  12. int tmp = arr[j];
  13. arr[j] = arr[j + 1];
  14. arr[j + 1] = tmp;
  15. }
  16. }
  17. }
  18. }

这个函数中需要注意的是循环条件要怎么写,因为第一趟冒泡需要进行9次相邻元素的比较,第二趟冒泡排序,需要进行8次冒泡排序,依次往下,直到第九趟冒泡排序,进行1次冒泡排序后,整个数组呈现顺序排列。所以外层循环控制要进行几趟冒泡排序,内层循环要控制一趟冒泡排序中需要进行多少次相邻元素的比较,这里内层循环中的循环判断条件是j<sz-1-i是因为一趟冒泡排序会使数组中最大的数到达最右边,而后进行下一趟冒泡排序时,排在最右边的数相较于前面已经是最大的数,前面的数就不需要再和最右面的元素进行比较,因而每一趟下来,就会减少一次相邻元素的比较。又因为i在每轮循环后会加1,则sz-1-i就会减小,所以构造的循环判断条件既是如此。(这里要注意数组的下标是从0开始)

 在主函数中调用bubble_sort函数实现一个数组元素的冒泡排序:

  1. #include<stdio.h>
  2. int main()
  3. {
  4. int arr[10] = { 0 };
  5. int sz = sizeof(arr) / sizeof(arr[0]); //数组元素个数
  6. int n = 0;
  7. for (n = 0; n < sz; n++) //用来输入数组元素
  8. {
  9. scanf("%d", &arr[n]);
  10. }
  11. bubble_sort(arr, sz);
  12. int i = 0;
  13. for (i = 0; i < sz; i++) //用来打印数组元素
  14. {
  15. printf("%d ", arr[i]);
  16. }
  17. return 0;
  18. }

程序运行结果:

 但是这个程序还不够完善,在上述冒泡序中也许在进行完某趟冒泡排序后(还没有到最后一趟冒泡排序),数组其实就已经达到了顺序排列,而后再进行下一趟冒泡排序时还要进行相邻元素的比较,这样效率就不够高,改进该函数使冒泡排序的效率提高:

  1. void bubble_sort(int arr[],int sz)
  2. {
  3. int count = 0; //用来统计比较次数
  4. int i = 0;
  5. for (i = 0; i < sz - 1; i++)
  6. {
  7. int flag = 1; //定义一个变量用来观测数组是否已经达到了顺序排列
  8. int j = 0;
  9. for (j = 0; j < sz - 1 - i; j++)
  10. {
  11. if (arr[j] > arr[j + 1])
  12. {
  13. int tmp = arr[j];
  14. arr[j] = arr[j + 1];
  15. arr[j + 1] = tmp;
  16. flag = 0;
  17. }
  18. count++;
  19. }
  20. if (flag == 1)
  21. {
  22. break;
  23. }
  24. }
  25. printf("比较了%d次\n",count);
  26. }

上面用flag变量来监测数组,如果在一趟冒泡排序中没有发生元素的交换,说明已经达到了顺序排列,就不需要再进行下一趟冒泡排序,直接跳出循环。再用一个count变量来记录数组中两两相邻元素比较了多少次,来看看效率是否提高了。

程序运行结果:

由图可知,顺序排列的数组元素,只需要进行9次相邻元素的比较即可,效率确实提高了。

如果文章还有哪些不足,欢迎小伙伴们评论留言。下面是冒泡排序的程序代码,有兴趣的小伙伴可以下载了解。

Bubble_Sort/Bubble_Sort/bubble_sort.c · 俺叫熊二/米饭工厂 - Gitee.com

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/806088
推荐阅读
相关标签
  

闽ICP备14008679号