冒泡排序是最简单的排序方法,理解起来容易。虽然它的计算步骤比较多,不是最快的,但它是最基本的,初学者一定要掌握。

冒泡排序的原理是:从左到右,相邻元素进行比较。每次比较一轮,就会找到序列中最大的一个或最小的一个。这个数就会从序列的最右边冒出来。

以从小到大排序为例,第一轮比较后,所有数中最大的那个数就会浮到最右边;第二轮比较后,所有数中第二大的那个数就会浮到倒数第二个位置……就这样一轮一轮地比较,最后实现从小到大排序。

举例说明:要排序数组:int[] arr={6,3,8,2,9,1};

第一趟排序:

    第一次排序:6和3比较,6大于3,交换位置:  3  6  8  2  9  1

    第二次排序:6和8比较,6小于8,不交换位置:3  6  8  2  9  1

    第三次排序:8和2比较,8大于2,交换位置:  3  6  2  8  9  1

    第四次排序:8和9比较,8小于9,不交换位置:3  6  2  8  9  1

    第五次排序:9和1比较:9大于1,交换位置:  3  6  2  8  1  9

    第一趟总共进行了5次比较, 排序结果:      3  6  2  8  1  9

---------------------------------------------------------------------

第二趟排序:

    第一次排序:3和6比较,3小于6,不交换位置:3  6  2  8  1  9

    第二次排序:6和2比较,6大于2,交换位置:  3  2  6  8  1  9

    第三次排序:6和8比较,6大于8,不交换位置:3  2  6  8  1  9

    第四次排序:8和1比较,8大于1,交换位置:  3  2  6  1  8  9

    第二趟总共进行了4次比较, 排序结果:      3  2  6  1  8  9

---------------------------------------------------------------------

第三趟排序:

    第一次排序:3和2比较,3大于2,交换位置:  2  3  6  1  8  9

    第二次排序:3和6比较,3小于6,不交换位置:2  3  6  1  8  9

    第三次排序:6和1比较,6大于1,交换位置:  2  3  1  6  8  9

    第二趟总共进行了3次比较, 排序结果:         2  3  1  6  8  9

---------------------------------------------------------------------

第四趟排序:

    第一次排序:2和3比较,2小于3,不交换位置:2  3  1  6  8  9

    第二次排序:3和1比较,3大于1,交换位置:  2  1  3  6  8  9

    第二趟总共进行了2次比较, 排序结果:        2  1  3  6  8  9

---------------------------------------------------------------------

第五趟排序:

    第一次排序:2和1比较,2大于1,交换位置:  1  2  3  6  8  9

    第二趟总共进行了1次比较, 排序结果:  1  2  3  6  8  9

---------------------------------------------------------------------

最终结果:1  2  3  6  8  9

---------------------------------------------------------------------

1.如果我们的数据正序,只需要走一趟即可完成排序。所需的比较次数C和记录移动次数M均达到最小值,即:Cmin=n-1;Mmin=0;所以,冒泡排序最好的时间复杂度为O(n)。

2.如果很不幸我们的数据是反序的,则需要进行n-1趟排序。每趟排序要进行n-i次比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:

# include <stdio.h>
int main(void)
{int a[] = {900, 2, 3, -58, 34, 76, 32, 43, 56, -70, 35, -234, 532, 543, 2500};int n;  //存放数组a中元素的个数int i;  //比较的轮数int j;  //每轮比较的次数int buf;  //交换数据时用于存放中间数据n = sizeof(a) / sizeof(a[0]);  /*a[0]是int型, 占4字节, 所以总的字节数除以4等于元素的个数*/for (i=0; i<n-1; ++i)  //比较n-1轮{for (j=0; j<n-1-i; ++j)  //每轮比较n-1-i次,{if (a[j] < a[j+1]){buf = a[j];a[j] = a[j+1];a[j+1] = buf;}}}for (i=0; i<n; ++i){printf("%d\x20", a[i]);}printf("\n");return 0;
}

冒泡排序算法的改进

1.设置一标志性变量pos,用于记录每趟排序中最后一次进行交换的位置。由于pos位置之后的记录均已交换到位,故在进行下一趟排序时只要扫描到pos位置即可。

2.传统冒泡排序中每一趟排序操作只能找到一个最大值或最小值,我们考虑利用在每趟排序中进行正向和反向两遍冒泡的方法一次可以得到两个最终值(最大者和最小者) , 从而使排序趟数几乎减少了一半。

冒泡排序及C语言代码相关推荐

  1. 10个数冒泡排序法c语言代码,输入10个数用冒泡法排序

    输入10个数,用冒泡排序法按由小到大顺序排序并输如下参考: #包括< stdio, h > Intmain() { Inta[10]={0}: IntI=0,j=0,t=0: For (I ...

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

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

  3. 冒泡排序的两种方式c语言代码,【C语言】两种方式实现冒泡排序算法

    题目要求 编写一个C语言程序,实现基本的冒泡排序算法. 算法 冒泡排序,用一句话来总结: 一组数中,相邻的两个数进行比较.交换,将最大(小)数交换至尾(首)部,即完成了一次冒泡排序 要想对N个数字进行 ...

  4. 快速排序c语言实现,快速排序的C语言代码实现

    快速排序实质上是对"冒泡排序"的一种改进,整个排序过程可概括为:通过N趟的排序将原本的排序数据分为若干块进行分块排序,而在每趟排序过程中,以指定的关键字将待排数据分别分为比关键字大 ...

  5. 构建线性表的c语言代码,数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码...

    1.运行环境 这里说明一下这里所有的C语言代码都是基于code::blocks 20.03编译运行的.当然一些其他集成开发环境应该也是可以的,个人不太喜欢功能太过强大的IDE,因为那同样意味着相关设置 ...

  6. c 语言从大到小排序算法,10 大经典排序算法(动图演示+ C 语言代码)

    原标题:10 大经典排序算法(动图演示+ C 语言代码) 来源:C语言与CPP编程 以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,系统地学习很有必要. ...

  7. c语言代码先来先服务算法_C语言十大经典排序算法(动态演示+代码,值得收藏)...

    以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,系统地学习很有必要. 时间.空间复杂度比较 排序算法 平均时间复杂度 最差时间复杂度 空间复杂度 数据对象 ...

  8. C语言编写程序助手,C语言代码实例助手下载

    c语言代码实例助手是一款简单专业的C语言学习助手软件,该软件可以帮助用户执行和调试用户编写的代码,同时还内置有多种入门学习代码,还为用户整合了C语言学习过程中可以遇到的问题,其中包括入门代码.算法.图 ...

  9. c语言 string code,ctestcode C语言代码实例助手下载

          ctestcode C语言代码实例助手官方版是一款极具特色的C语言学习助手软件,ctestcode C语言代码实例助手最新版可以帮助用户执行和调试用户编写的代码,ctestcode C语言 ...

最新文章

  1. 解决MySQL8.0报错:Unknown system variable 'validate_password_policy'
  2. Silverlight教程第四部分:使用 Style 元素更好地封装观感 (木野狐译)
  3. 5月24日起,每晚8点,实时数仓入门训练营见!
  4. 压缩命令_Linux gzip命令:压缩文件或目录
  5. python用正则表达式提取中文_python3.x提取中文的正则表达式示例代码
  6. Android中resource参数变量使用
  7. 深入理解计算机系统(1)--hello world程序的生命周期
  8. 公共的数据库访问访问类 SqlHelper.cs
  9. warning: malformed '#pragma pack(pop[, id])' - ignored
  10. 操作——UE常用快捷键
  11. 软件测试入门随笔——软件测试基础知识(七)
  12. JVM3:实战:内存分配与回收策略
  13. Ajax.NET中的ajax.js脚本
  14. 东方博宜OJ 1052 - 【入门】行李托运费
  15. 基于粒子群算法的冷热电三联供综合能源系统优化调度
  16. 华为HCIE专家认证相关简介
  17. Virtual reality
  18. 【SQL】排名函数ROW_NUMBER、RANK、DENSE_RANK和NTILE讲解
  19. 英语汉语对比学习:语言起源与词的分类
  20. 机器学习与深度学习常识

热门文章

  1. 安装texlive遇到中文系统名的问题:open(>C:\Users\**\AppData\Local\Temp\S_Dmsx82uz\mYrZUHgkXu/texlive.infra.w
  2. MyBatis学习笔记(一)——配置文件中的别名以及mapper中的namespace
  3. 【熬夜整理近百份大厂面经】2022校招提前批面经总结分享(腾讯、字节、阿里、百度、京东等招聘信息+必考点+简历书写)
  4. ubuntu18里用python编写modbus-RTS
  5. vMAP:用于神经场 SLAM 的矢量化对象建图
  6. SQL SERVE 的数据库安全性研究
  7. MyBatis Generator(MBG)PostgreSQL使用说明 区分大小写敏感
  8. PS批量改图片PPI
  9. 马斯克对话“虚拟版”马斯克,脑机交互技术离我们有多远
  10. 美容院SPA会员管理系统(含微信端)