冒泡排序的来源

这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

  冒泡排序是交换排序的核心排序 ,基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置。

        交换排 序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。

冒泡排序算法的原理: 

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。

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

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

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

冒泡排序的特性总结:

1. 冒泡排序是一种非常容易理解的排序

2. 时间复杂度:O(N^2)

3. 空间复杂度:O(1)

4. 稳定性:稳定

基于排序原理与排序总结出来的规律,我们可以写出冒泡函数


void bubble_sort1(int arr[], int sz) {int i = 0;for (i = 0; i < sz - 1; i++) {int j = 0;for (j = 0; j < sz - i - 1; j++) {if (arr[j] > arr[j + 1]) {int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;}}}
}int main() {int arr[] = { 9,8,7,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);//调用冒泡排序bubble_sort1(arr, sz);//遍历数组int i = 0;for (i = 0; i < sz; i++) {printf("%d ", arr[i]);}return 0;
}

如上就是对数组进行升序排列的代码分析,但是这样的函数排序是有缺陷的,假如我的arr中的代码是:int arr[ ]={0,1,2,3,4,5,6,7,8,9 }; arr为有序代码,那么传入排序函数中时,函数可不会管是不是有序,还是进行着9趟排序,每趟两两比较,会花费大量的时间去比较,降低了算法效率的时间复杂度,此种函数的冒泡排序时间复杂度便是最坏的,为O (n^2)。

那么我们需要在函数中增加一个变量使其去判断数组经过每一趟排序后的结构是否有序,若途中判断为有序,则直接跳出循环,不再排序。如下为优化后的代码:

//优化后的函数
void bubble_sort2(int arr[], int sz) {int i = 0;for (i = 0; i < sz - 1; i++) {int flag = 1;//初始化为有序int j = 0;for (j = 0; j < sz - i - 1; j++) {if (arr[j] > arr[j + 1]) {int tmp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = tmp;flag = 0;//表明数组现在处于无序状态}if (flag == 1) {break;//停止排序,跳出循环}}}
}
int main() {int arr[] = { 9,8,7,6,5,4,3,2,1,0 };int sz = sizeof(arr) / sizeof(arr[0]);bubble_sort2(arr, sz);//优化后的函数int i = 0;for (i = 0; i < sz; i++) {printf("%d ", arr[i]);}return 0;
}

好了,冒泡排序就讲到这里,大家觉得有用的话,点个一键三连吧!下次再见!

C语言之冒泡排序的代码讲解相关推荐

  1. c语言冒泡排序法代码(c语言冒泡排序法代码讲解)

    求一个C语言冒泡排序法的简单程序怎么办? 下一趟排序开始时,R[1..lastExchange-1]是有序区,R[lastExchange..n]是无序区.这样,一趟排序可能使当前有序区扩充多个记录, ...

  2. 液晶显示屏的C语言编码,液晶屏代码讲解

    关于指针和1602液晶屏的知识讲解我们就不赘述了,<手把手教你学51单片机>文档第12,13章有很详细的讲解,我们也不用再自己搞些与众不同的驱动代码,没必要再"重新发明轮子&qu ...

  3. C语言实现扫雷完整代码讲解

    扫雷是一款初学者能用C语言实现的益智小游戏,只需要用二维数组操作雷区即可. 算法详讲 : 游戏思路如下:点击雷区中的任一格子,如果该格子有雷,则游戏结束:如果该格子周围9个格子都不是雷,那么直接展开其 ...

  4. c语言选择冒泡排序,c语言选择冒泡排序讲解(附代码)

    c语言选择冒泡排序讲解(附代码) c语言选择冒泡排序讲解(附代码) 冒泡排序原理举例: 给定一组数 15 20 1 16 进行从大到小冒泡排序.第一次起泡的第一次比较:用15和20比较,若15比20小 ...

  5. WPF第一章(XAML前台标记语言(Chapter02代码讲解))

    XAML前台标记语言(Chapter2代码讲解)     很不好意思,工作有点忙,博客停了两天.相对于一门语言的学习,理论知识和实践必不可少,大多数时间我们要用,对于代码也是,一边不行可以看两遍,实在 ...

  6. 冒泡排序c java c,冒泡排序,c语言冒泡排序法代码

    冒泡排序,c语言冒泡排序法代码 冒泡排序 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法. 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小.首字 ...

  7. JAVA冒泡排序算法(含详细过程代码讲解及优化)

    冒泡排序算法拆分讲解及优化 java冒泡排序 一.代码的拆分讲解 从上面步骤,可以观察到每次的j都相对于前一趟进行-1操作,所以可以把这些操作套在一个for循环里来控制j即可. 二.冒泡排序的代码 优 ...

  8. c语言程序设计冒泡排序在哪,C语言程序设计冒泡排序教学案例杨进

    <C语言程序设计冒泡排序教学案例杨进>由会员分享,可在线阅读,更多相关<C语言程序设计冒泡排序教学案例杨进(5页珍藏版)>请在人人文库网上搜索. 1.C语言程序设计冒泡排序教学 ...

  9. c语言中字符指针变量输入,C语言指针基础知识实例讲解

    对程序进行编译的时候,系统会把变量分配在内存单位中,根据不同的变量类型,分配不同的字节大小.比如int整型变量分配4个字节,char字符型变量分配1个字节等等.被分配在内存的变量,可以通过地址去找到, ...

最新文章

  1. 《设计的品格 探索×呈现×进化的InDesign美学》—第1课1.4节单位和度量
  2. mvc学习-编辑提交需要注意-mvc重点
  3. 如何让人大致理解RxJava思想:第一节 初步理解RxJava
  4. 傅里叶分析斯坦恩中文版pdf_实分析(英文版)[(美)斯坦恩(Stein,E.M.) 著] 2013年版...
  5. LIVE555再学习 -- Linux 下编译
  6. CF633C Spy Syndrome 2
  7. CodeFirst EF中导航属性的个人理解
  8. 2019.3.23 python的unittest框架与requests
  9. 补作业:随机生成二元四则运算
  10. java 注解入门 简书_Java注解入门
  11. ubuntu下screen的使用
  12. 向设计师分享30个免费的扁平化风格设计素材
  13. NOI2015 小园丁与老司机
  14. java 线程概念_java并发编程之 java线程基本概念
  15. Python GUI工具——取色器
  16. redis使用及Spring Session+Redis实现Session共享
  17. 20201110提莫攻击
  18. 【文献学习】Analysis of Deep Complex-Valued Convolutional Neural Networks for MRI Reconstruction
  19. 正交试验设计的基本步骤
  20. 侍魂qq最新服务器,2018腾讯发布火影、圣斗士星矢、侍魂等20款新手游

热门文章

  1. 你知道微服务架构深度解析:微服务的主要特性有哪些吗?
  2. 5年桌面运维,而立之年了,看不到希望,求出路?
  3. zabbix mysql qps_zabbix监控mysql的tps和qps
  4. 物联网的新应用--触摸物联网
  5. Tomcat 配置SSL证书
  6. linux 基本操作命令1
  7. 星盛商业表现平平:打新中签者浮亏,新世界发展等为基石投资人
  8. 联盛德 HLK-W806 (六): I2C驱动SSD1306 128x64 OLED液晶屏
  9. Mosh Python 学习笔记
  10. 关于数据库中的delete,truncate,drop