大家好!我们又见面了!计算机代码的实现都是靠一个一个算法实现的,今天就给小伙伴们介绍一种非常简单的算法---冒泡排序,冒泡排序(Bubble Sort)也是一种简单直观的排序算法。它反复的将需要排序的数列一直两两进行排序,每次只比较两个元素,如果顺序不对就将他们交换,重复进行直到没有元素还需要交换,此时,也就表示数列的排序已经完成。这个算法名字的由来是因为小的元素会像“泡泡”一样通过一次次交换慢慢的“”到数列的最顶端位置。作为最简单的算法之一,与我们而言就好像在四级词汇中看到“abandon”一样,非常简单但是常见,因此最为我们熟悉。

可能文字对于这种算法描述还是太过生涩难懂,那么我将具一个通俗易懂的例子:

有数组arr[10]={10,9,8,7,6,5,4,3,2,1}这样十个整形的数字,此时我们需要从小到大进行排序,我们选择采取冒泡排序。

10 9 8 7 6 5 4 3 2 1    10与9进行比较,发现10>9,则改变数组为9 10 8 7 6 5 4 3 2 1;

9 10 8 7 6 5 4 3 2 1    再10与8进行比较,发现10>8,则改变数组为9 8 10 7 6 5 4 3 2 1;

9 8 10 7 6 5 4 3 2 1    再10与7进行比较,发现10>7,则改变数组为9 8 7 10 6 5 4 3 2 1;

9 8 7 10 6 5 4 3 2 1    再10与6进行比较,发现10>6,则改变数组为9 8 7 6 10 5 4 3 2 1;

9 8 7 6 10 5 4 3 2 1    再10与5进行比较,发现10>5,则改变数组为9 8 7 6 5 10 4 3 2 1;

......

最终结果变成9 8 7 6 5 4 3 2 1 10,这时仅仅只是完成了第一轮冒泡排序。

当数组arr变成9 8 7 6 5 4 3 2 1 10时,开始第二轮冒泡排序。

9 8 7 6 5 4 3 2 1 10    9与8进行比较,发现9>8,则改变数组为8 9 7 6 5 4 3 2 1 10;

8 9 7 6 5 4 3 2 1 10    再9与7进行比较,发现9>7,则改变数组为8 7 9 6 5 4 3 2 1 10;

8 7 9 6 5 4 3 2 1 10    再9与6进行比较,发现9>6,则改变数组为8 7 6 9 5 4 3 2 1 10;

8 7 6 9 5 4 3 2 1 10    再9与5进行比较,发现9>5,则改变数组为8 7 6 5 9 4 3 2 1 10;

8 7 6 5 9 4 3 2 1 10    再9与4进行比较,发现9>4,则改变数组为8 7 6 5 4 9 3 2 1 10;

......

最终结果变成8 7 6 5 4 3 2 1 9 10,这时完成了第二轮冒泡排序。

当数组arr变成8 7 6 5 4 3 2 1 9 10时,开始第三轮冒泡排序。

我们不难发现结果最终成为了7 6 5 4 3 2 1 8 9 10。

......

最终经过9轮排序最终成功得到1 2 3 4 5 6 7 8 9 10。

通过这个例子大家肯定明白冒泡排序到底是怎么一回事,大家想想看这个排序方法什么时候最快?什么时候最慢?当它正序排序的时候最快,因为根本不需要,冒泡排序,而上面的例子(反序)这个时候就是最慢,此时我们写个for循环不应该更快吗?其实并不是没有道理,所以冒泡排序其实很简单也很“笨”。不过这样“笨笨的”冒泡排序也并不是毫无优点可言,不然它就没有存在的必要。

时间复杂度

若文件的初始状态是正序的,一趟扫描即可完成排序。所需的关键字比较次数C和记录移动次数M均达到最小值:Cmin=n-1,Mmin=0。所以,冒泡排序最好的时间复杂度为O(n)。若初始文件是反序的,需要进行n-1趟排序。每趟排序要进行n-i次关键字的比较(1≤i≤n-1),且每次比较都必须移动记录三次来达到交换记录位置。在这种情况下,比较和移动次数均达到最大值:

Cmax=n(n-1)/2=O(n^2)

Mmax=3n(n-1)/2=O(n^2)

冒泡排序的最坏时间复杂度为O(n^2) 。综上,因此冒泡排序总的平均时间复杂度为O(n^2)。

算法稳定性

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

下面给大家带来代码展示:

#include <stdio.h>
#include <string.h>
void Sort(int *arr, int sz)
{int i = 0;//趟数for (i = 0; i < sz-1; i++){int j = 0;//每次冒泡排序都会使得最后一个数正确,每趟需要两两比较的次数都会减1for (j = 0; j < sz - 1 - i; j++){if (arr[j] > arr[j + 1]){int temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}
int main()
{int arr[] = { 8,5,1,7,9,4,0,3,2,6 };int sz = sizeof(arr) / sizeof(arr[0]);Sort(arr, sz);int i = 0;for (i = 0; i < sz; i++){printf("%d ", arr[i]);}return 0;
}

运行结果正是我们想要的结果:

那么到这里给大家分享的第一种算法到这里也就结束了,欢迎大家点赞收藏!

排序算法——冒泡排序相关推荐

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

    C语言基础排序算法-冒泡排序 什么是冒泡排序? 顾名思义,这种排序方法就像水中的气泡一样,从底逐渐往上冒,一次前进一步.我们来看一个例子,看看到底是怎么冒泡的.假设有一个数组3,2,5,4,1,我们希 ...

  2. 经典排序算法 - 冒泡排序Bubble sort

    经典排序算法 - 冒泡排序Bubble sort 其原理是比较接近的数字22,按照从小到交换大或降序排列, 这样一趟过去后,最大或最小的数字被交换到了最后一位, 然后再从头開始进行两两比較交换,直到倒 ...

  3. 排序算法——冒泡排序(Bubble Sort)

    排序算法--冒泡排序(Bubble Sort) 算法简介(Introduction) Bubble sort is to compare adjacent elements of the list a ...

  4. python排序算法 ——冒泡排序(附代码)

    python排序算法 --冒泡排序 文章目录 python排序算法 --冒泡排序 一.前言 二.算法描述 三.代码实现 总结 一.前言 相关知识来自<python算法设计与分析>.初级排序 ...

  5. 十大经典排序算法-冒泡排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  6. 排序算法---冒泡排序(java版)

    冒泡排序 原理 冒泡排序(Bubble Sort)是一种简单的排序算法,它通过依次比较两个相邻的的元素,看两个元素是否满足大小关系要求,如果不满足则交换两个元素.每一次冒泡会让至少一个元素移动到它应该 ...

  7. 排序算法--冒泡排序的首尾改进

    在排序算法中,冒泡排序是一个很经典的算法,最初的冒泡排序一直要运行n-1次,但是其中有些事不必要的操作,例 如,当没有两个数据发生交换时,就可以结束运行. 本文介绍的一种方法是对上述条件的改进,即不仅 ...

  8. 排序算法 —— 冒泡排序

    基本思想 n个元素,从第1个开始,依次比较相邻的两个是否逆序对(大在前,小在后),若逆序就交换两个元素,即第1个和第2个比,若逆序就交换两个元素,接着第2个和第3个比,若逆序就交换两个元素,接着第3个 ...

  9. 深入浅出的排序算法-冒泡排序

    前言 大家好,给大家带来冒泡排序算法,希望你们喜欢 冒泡排序 为什么这个排序要叫冒泡呢?为什么不叫其他名词呢?其实这个取名是根据排序算法的基本思路命名的,见名知意,冒泡排序,就是想泡泡在水里一样,在水 ...

  10. 排序算法-冒泡排序算法

    2019独角兽企业重金招聘Python工程师标准>>> 冒泡排序算法是所有排序算法中最简单.最基础的一种.冒泡排序算法的思路就是交换排序,通过相邻数据的交换来达到排序的目的. 冒泡排 ...

最新文章

  1. 随机位置显示图片不重叠前端实现详细讲解附效果图,代码可直接使用
  2. 多尺度人脸检测--Face Detection through Scale-Friendly Deep Convolutional Networks
  3. 编程之美-24点游戏方法整理
  4. Eclipse 高亮显示选中的相同变量
  5. 五大地形等高线特征_高中地理学习中如何快速掌握等高线地形图
  6. linux下安装oracle 11g R2
  7. Halcon算子学习:smooth_object_model_3d
  8. Python稳基修炼的经典案例4(计算机二级、初学者必须掌握的例题)
  9. ubuntu14.04 配置jdk环境变量
  10. 如何在 macOS 上安装Axure RP
  11. 计算机打表格图,怎么把电脑整个表格截屏,表格太长,还有部(怎么把excle表格截图)...
  12. linux yum clean up,在CentOS系统中使用package-cleanup清除旧内核
  13. java的程序的创建快捷方式_关于Swing:如何为Java程序创建快捷方式图标
  14. 如何将汉字写得又好又快
  15. PHP - 命名空间(namespace)概述及实例说明
  16. 【金猿产品展】星环KunDB ——助力企业数字化转型的高性能分布式交易型数据库...
  17. 太极拳经验谈 --- 董英杰
  18. Soul(灵魂)匹配脚本、autojs、按键精灵~
  19. 全网最全持续集成接口自动化-jmeter+ant+jenkins
  20. Fabric学习(一) — 区块链及相关技术介绍

热门文章

  1. 通过NAT64实现ipv6 client 访问ipv4 Server
  2. excel午晚加班考勤统计(excel快速计算午多少个和晚多少个)
  3. 修改移动硬盘盘符(G盘--E盘)
  4. 计算机中的信息计量单位字,计算机中信息的计量单位.pdf
  5. CSS设计彻底研究-读书笔记
  6. HDMI九画面视频分割器(MT-SW091)
  7. Java中9种常见的CMS GC问题分析与解决
  8. 新手入门笔记——linux常用命令总结
  9. MediaWiki中的各种功能和设置
  10. pmos低电平驱动_详细讲解MOSFET管驱动电路