C语言基础排序算法-冒泡排序

什么是冒泡排序?

顾名思义,这种排序方法就像水中的气泡一样,从底逐渐往上冒,一次前进一步。我们来看一个例子,看看到底是怎么冒泡的。假设有一个数组3,2,5,4,1,我们希望按照从小到大的顺序排序,最后的结果为1,2,3,4,5。记住冒泡算法的关键一点是每次相邻的两个元素进行比较,如果不满足排序的要求(比如后面的一个元素大于前面的元素),则进行交换。基本原理如下:

(1) 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

(2)针对所有的元素重复以上的步骤,除了最后一个。

(3)持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

冒泡排序一般要用两层循环,所以冒泡排序的时间复杂度为O(n2),n2代表n的平方。很多初学者朋友想用一层循环就来冒泡排序,这是做不到的。

冒泡排序的代码如下:

void bubble_sort(int arr[],int size)
{int i=0;int j=0;int temp = 0;for(i=0;i<size - 1;i++){for(j=0;j<size - 1 -i;j++){if(arr[j] > arr[j+1]){temp = arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}
}

下面对代码的执行过程进行详细解释。

开始的数组状态为:

经过第一次比较之后,由于3大于2,所以2和3交换,如图所示。

第二次比较,3小于5,所以不用交换,结果不变,如图所示。

第三次比较,5大于4,所以交换,结果如图所示。

第四次比较,5大于1,所以仍然要交换,结果如图所示。

经过4次比较,就完成了第一轮的排序,也就把最大的值排到了最后,因此,第二轮的比较,就不用比较到最后了,只比较到1就可以了。

第二轮第一次比较,由于2小于3,所以第二轮第一次结果不变,结果如图所示。

第二轮第二次比较,由于3还是小于4,所以结果不变,如图所示。

第二轮第三次比较,由于4大于1,所以4和1交换,结果如图所示。

这样,第二轮就比较完了,比较了3次。下面进行第三轮比较。

第三轮第一次,由于2小于3,所以不用交换,不变,结果如图所示。

第三轮第二次,由于3大于1,所以要交换,结果如图所示。

第三轮就比较结束了,共比较2次。再进行最后一轮的比较,第四轮比较。

第四轮,也就是最后一轮,只需要比较一次。

第四轮第一次比较,由于2大于1,所以2和1进行交换,交换后的结果如图所示。

这样经过四轮比较,具有5个元素的数组就排序完成了,总共比较了4+3+2+1次,一共10次比较。

我们对代码进行稍微改变一下,统计一下比较的次数和交换的次数,最后打印一下,代码如下:

#include <stdio.h>void bubble_sort(int arr[],int size)
{int i=0;int j=0;int temp = 0;int compare_times = 0;int swap_times = 0;for(i=0;i<size - 1;i++){for(j=0;j<size - 1 -i;j++){compare_times++;if(arr[j] > arr[j+1]){temp = arr[j];arr[j]=arr[j+1];arr[j+1]=temp;swap_times++;}}}printf("比较的次数为:%d,交换次数为:%d\n",compare_times,swap_times);
}
int main()
{int i=0;int arr[]={3,2,5,4,1};int count = sizeof(arr)/sizeof(int);bubble_sort(arr,count);printf("sorted\n");for(i=0;i<count;i++){printf("%d ",arr[i]);}printf("\n");return 0;
}

最后运行结果如图所示。

冒泡排序实际的比较次数和交换次数最多为:

n(n+1)/2,所以复杂度是n的平方。

C语言基础排序算法-冒泡排序相关推荐

  1. C语言基础排序算法-选择排序

    C语言基础排序算法-选择排序 什么是选择排序? 选择排序(Selection sort)是一种简单直观的排序算法,第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从 ...

  2. 基础排序算法 – 冒泡排序Bubble sort

    原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头开始进行两两比较交换,直到倒数第二位时结束. 从小到大排序: 原 ...

  3. 动图图解C语言选择排序算法,含代码分析

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

  4. 基础排序算法详解与优化

    文章图片存储在GitHub,网速不佳的朋友,请看<基础排序算法详解与优化> 或者 来我的技术小站 godbmw.com 1. 谈谈基础排序 常见的基础排序有选择排序.冒泡排序和插入排序.众 ...

  5. php四种基础排序算法的运行时间比较

    /*** php四种基础排序算法的运行时间比较* @authors Jesse (jesse152@163.com)* @date 2016-08-11 07:12:14*/ //冒泡排序法 func ...

  6. C语言八大排序算法,附动图和详细代码解释!

    文章来源:电子工程专辑.C语言与程序设计.竹雨听闲 一.前言 如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功. 想写出精炼.优秀的代码,不通过不断的锤炼,是很难做到的. 二. ...

  7. 硬核!C语言八大排序算法,附动图和详细代码解释!

    来源 :C语言与程序设计.竹雨听闲等 一 前言 如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功. 想写出精炼.优秀的代码,不通过不断的锤炼,是很难做到的. 二 八大排序算法 ...

  8. 基本的排序算法php,php四种基础排序算法

    原标题:php四种基础排序算法 曾经有网友问我关于面试题的问题,今天就发一个面试题笔试经常会出的排序算法,大家可以参考一下,如有问题可以给我留言. /** * php四种基础排序算法的运行时间比较 * ...

  9. 序列划分c语言,一篇“get”C语言八大排序算法

    如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功. 想写出精炼.优秀的代码,不通过不断的锤炼,是很难做到的. 二.八大排序算法 排序算法作为数据结构的重要部分,系统地学习一下是 ...

最新文章

  1. Context-----Activity,Application之间的交流使者
  2. 熟悉常用的HDFS操作
  3. 四则运算个人项目反思总结
  4. 二叉树---根据【先序、中序序列】and【中序、后序序列】,画出二叉树!
  5. 一封电子邮件的发送和接收的主要步骤
  6. windows mobile 编译(生成镜像)提速
  7. Python- 解决PIP下载安装速度慢
  8. Python在视频处理上的优势有哪些
  9. nutwk的maven中央仓库及配置
  10. 精读《如何编译前端项目与组件》
  11. 拿别人源码去申请软著_别拿自己的尺子,去丈量别人的生活!
  12. espritcam后处理教学_Master CAM 后置处理文件及其设定方法详细说明
  13. Kotlin基础学习-入门篇
  14. 搭建AutoCAD License服务器
  15. 计算机硬件系统主机主要包括,组成计算机硬件系统的基本部分是什么?
  16. 使用Stellarium查看彗星
  17. 1908: 【18NOIP提高组】填数游戏
  18. 前K个高频元素[小根堆和大根堆的使用]
  19. Matlab调用动态链接库DLL文件
  20. Git代码reset回滚无效解决

热门文章

  1. hbase 协处理器 部署_hbase中安装和删除observer协处理器
  2. html 查询表单,如何让我的HTML表单查询适用于所有表单元素?
  3. oracle批量加载,Oracle教程:使用SQL*Loader高速批量数据加载工具
  4. java char 初始化为空格_java中char的初始值此代码运行后,char的初始值为空?为 爱问知识人...
  5. opencv orb
  6. tushare 新功能(导入股票和大盘历史数据)
  7. 计算机组成801pan,计算机组成06801.ppt
  8. 青海省西宁市职称计算机考试试题,【青海西宁2017年第一批职称计算机考试时间4月8日起】- 环球网校...
  9. phpbreak跳出几层循环_php中break如何跳出多重循环的示例代码
  10. 168. Excel Sheet Column Title