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

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

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

比如对下面这个序列进行从小到大排序:
90 21 132 -58 34

第一轮:

  1. 90 和 21比,90>21,则它们互换位置:
    21 90 132 -58 34

  2. 90 和 132 比,90<132,则不用交换位置。

3)132 和 –58 比,132>–58,则它们互换位置:
21 90 -58 132 34

4)132 和 34 比,132>34,则它们互换位置:
21 90 -58 34 132

到此第一轮就比较完了。第一轮的结果是找到了序列中最大的那个数,并浮到了最右边。

比较时,每轮中第 n 次比较是新序列中第 n 个元素和第 n+1 个元素的比较(假如 n 从 1 开始)。

第二轮:

  1. 21 和 90 比,21<90,则不用交换位置。

  2. 90 和 –58 比,90>–58,则它们互换位置:
    21 -58 90 34 132

  3. 90 和 34 比,90>34,则它们互换位置:
    21 -58 34 90 132

到此第二轮就比较完了。第二轮的结果是找到了序列中第二大的那个数,并浮到了最右边第二个位置。

第三轮:

  1. 21 和 –58 比,21>–58,则它们互换位置:
    -58 21 34 90 132

  2. 21 和 34 比,21<34,则不用交换位置。

到此第三轮就比较完了。第三轮的结果是找到了序列中第三大的那个数,并浮到了最右边第三个位置。

第四轮:

  1. –58 和 21 比,–58<21,则不用交换位置。

至此,整个序列排序完毕。从小到大的序列就是“–58 21 34 90 132”。从这个例子中还可以总结出,如果有 n 个数据,那么只需要比较 n–1 轮。而且除了第一轮之外,每轮都不用全部比较。因为经过前面轮次的比较,已经比较过的轮次已经找到该轮次中最大的数并浮到右边了,所以右边的数不用比较也知道是大的。

废话也不多说了,直接上码

#include <stdio.h>
void main()
{ int num,n,temp;//定义变量int a[100];   //初始化数组printf("您要重新排列多少个数:  \n");scanf("%d",&num);n=num;  //获取数组的长度    另外还有一种:n = sizeof(a) / sizeof(a[0]);  /*a[0]是int型, 占4字节, 所以总的字节数除以4等于元素的个数*/int i=0;printf("请您输入排列的数:\n");while ( scanf("%d",&a[i]) && num >1)  //循环向数组中存入数{i++;num--;}printf("排列之前的顺序为:");for (int length=0;length<n;length++){printf("%3d",a[length]);}for (int j=0; j<n-1; j++)  //比较n-1轮{for (int k=0; k<n-1-j; k++)  //每轮比较n-1-j次,{/*if (a[k] < a[k+1]) //从大到小{temp = a[k];a[k] = a[k+1];a[k+1] = temp;}*/if (a[k] > a[k+1]) //从小到大{temp = a[k];a[k] = a[k+1];a[k+1] = temp;}}}printf("\n");printf("排列之后的顺序为:");for (int len=0;len<n;len++){printf("%3d",a[len]);}printf("\n");
}

结果如下图所示:

有人或许会问程序中,为什么每轮比较的次数是 k<n–1–j,而不是 k<n–1?

因为冒泡排序有一个特点,这个程序是从小到大排序,所以第一轮排序以后,最大的数就会浮到最右面;第二轮排序以后,第二大的数会浮到倒数第二个位置;第三轮排序以后,第三大的数会浮到倒数第三个位置……也就是说,排序多少轮,就有多少个数字已经按排序要求排好了,它们不需要再比较。写 k<n–1 也可以,只不过程序在执行时多做了许多无用功。

冒泡排序算法,C语言冒泡排序算法详解相关推荐

  1. 国密算法Go语言实现(详解)(九) ——SM2(椭圆曲线公钥密码算法)

    国密算法Go语言实现(详解)(九) --SM2(椭圆曲线公钥密码算法) 原创代码:https://github.com/ZZMarquis/gm 引用时,请导入原创代码库.本文仅以注释方式详解代码逻辑 ...

  2. 国密算法Go语言实现(详解)(十) ——SM2(椭圆曲线公钥密码算法)

    国密算法Go语言实现(详解)(十) --SM2(椭圆曲线公钥密码算法) 原创代码:https://github.com/ZZMarquis/gm 引用时,请导入原创代码库.本文仅以注释方式详解代码逻辑 ...

  3. 九大排序算法-C语言实现及详解

    概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存. 我们这里说说八大排序就是内部排序. 当n较大, ...

  4. 应用sobel算子算法c语言,Sobel算子详解

    1 .卷积应用-图像边缘提取 Sobel 算子是一个离散微分算子 (discrete differentiation operator). 它结合了高斯平滑和微分求导,用来计算图像灰度函数的近似梯度. ...

  5. c语言将AOE网络的数据写入TXT文档中,数据结构与算法学习辅导及习题详解.张乃孝版-C/C++文档类资源...

    数据结构与算法学习辅导及习题详解.张乃孝版.04年10月 经过几年的努力,我深深体会到,编写这种辅导书要比编写一本湝通教材困难得多. 但愿我的上述理想,在本书中能够得以体现. 本书的组织 本书继承了& ...

  6. EMD算法之Hilbert-Huang Transform原理详解和案例分析

    目录 Hilbert-Huang Transform 希尔伯特-黄变换 Section I 人物简介 Section II Hilbert-Huang的应用领域 Section III Hilbert ...

  7. 【数据结构与算法】哈希算法的原理和应用详解!

    在程序员的实际开发中,哈希算法常常能用得到,本文以哈希算法的原理和应用为核心,和大家详细讲解一下哈希算法的概念.常见算法以及原理.在信息安全的应用等等. 一.概念 哈希表就是一种以 键-值(key-i ...

  8. 扩展Euclidean算法求乘法逆原理详解与算法实现

    [利用扩展Euclidean算法求乘法逆] 1. Equipment (1) operating system version :WIN 10 (2) CPU instruction set: x 6 ...

  9. python模拟手写笔迹_Python实现基于KNN算法的笔迹识别功能详解

    本文实例讲述了Python实现基于KNN算法的笔迹识别功能.分享给大家供大家参考,具体如下: 需要用到: Numpy库 Pandas库 手写识别数据 点击此处本站下载. 数据说明: 数据共有785列, ...

  10. 算法问题:整数除法详解(Java方向)

    算法问题:整数除法详解(Java方向) 1.力扣题目 2.结果代码分析 3.完整的结果代码 4.代码出处和教学出处 5.博主 边学习边记录算法的学习 1.力扣题目 1.给定两个整数 a 和 b ,求它 ...

最新文章

  1. golang mysql 超时_golang中mysql建立连接超时时间timeout 测试
  2. 返回或输出类型为 unsigned 8-bit type(8U) 的函数积累!
  3. linux树莓派连接wifi密码,树莓派连接WiFi,不使用界面,多WiFi切换
  4. 算法 分析 (收集)
  5. Adobe illustrator 删除干扰元素 - 连载 15
  6. pythonself用法_全面理解python中self的用法
  7. C#图片处理之:旋转图片90度的整数倍
  8. shelve模块使用说明
  9. swift 3.0 协议笔记
  10. [Effective JavaScript 笔记] 第7条:视字符串为16位的代码单元序列
  11. 苹果开启了颠覆wintel的序幕,谷歌和ARM做好准备了么?
  12. 一、对文本文件进行数据粒度转换,即将文本文件personnel_data.txt中字段household_register的数据统一成省份,并且输出到文本文档personnel_data_new.tx
  13. 李彦宏的搜索技术传奇
  14. deepstream c++ rtsp流输出
  15. ARX项目lib依赖默认使用情况分析
  16. Java *2.22(财务应用:货币单位)改写程序清单2-10,解决将double转int可能会造成精度损失问题。以整数值作为输入,其最后两位代表的是美分币值。例如:1156就表示11美元56美分。
  17. Python语言程序设计基础 第二版(嵩天著)课后答案第四章
  18. 网络抓包工具 wireshark 入门教程
  19. 超长浮点数据到科学计数法的转换
  20. 15 python的文件操作

热门文章

  1. 动网 php v1.0 漏洞,动网论坛dispuser.php页面SQL注入漏洞
  2. WC .exe C语言实现
  3. 带你了解热门IoT开源项目:home assistant
  4. 支付宝/钉钉小程序实现蓝牙打印
  5. 用Windows内置工具测试硬盘速度
  6. 安卓 jni 开发错误 undefined reference to __android_log_print
  7. android沉浸式+虚拟按键+Fragment+CoordinatorLayout(2)
  8. iOS中定位以及地图的使用
  9. 思维导图:图模型的层次结构
  10. 天天优惠第一个版本于6月9日发布