【算法基础】关于冒泡,我们来排个序

简介: 【算法基础】关于冒泡,我们来排个序

一首《海阔天空》送给所有在外求学的游子。“今天我,寒夜里看雪飘过~~~”那么请问如何让大小不一的雪有顺序的排列呢?额,是不是有点扯远了……嗯,下面开始我们今天的(zhuang)习(bi)计划……

微信图片_20220420143104.gif



本节纲要


1.     冒泡排序的基本原理

2.     实现的具体代码

3.     冒泡排序的缺陷


引言


在我们初学者编程过程中,常常会遇到需要对一组无序的数据进行排序的问题,使之成为按从小到大或从大到小有序排列的数据。例如小程序中求一组数中最值,那么,有没有一些快速有效的方法能让我们更好的装个B呢?答案是有的!


微信图片_20220420143107.jpg

01

冒泡排序的基本原理

还是先来看一个小问题,对以下这组数据进行从小到大排列:

10  2  3  19  60  12


这时候可能有按耐不住的小伙伴要say something了,我就观察这组数,发现2最小,就把2放最左;60最大,就放到最右;类似的把剩下的数也这样处理不就行了吗?


emmm……蛋是,如果给你100个数字,10000个数字呢?你要观察到什么时候?所以,这种活,还是给computer来做吧~


在这里有请我们的主角冒泡排序(掌声在哪里?)登场。




基本原理:从数据最左边开始将相邻两数进行两两比较,然后将较小的数放在左边,较大的数放在右边(即交换两个数的位置,较大的数像一个泡泡一样往上升),依次下去,这组数据的最大值就到了最右边,但剩下的数据还是杂乱,所以还必须对剩下的数据按刚才的方法再来排序;那么就可以得到了从小到大排列的数据。细心的读者从以上描述中可能会发现我们将用到两个for循环的嵌套。(类似的从大到小的排列也是可以实现的)

还是结合上面的例子给大家分步讲解一下吧~

首先将10和2比较,因为10<2,所以数组变为

   2  10  3  19  60  12

然后将10和3比较,因为10>3,所以数组变为

   2  3  10  19  60  12

③接着将10和19比较,因为10<19,所以数组不变

   2  3  10  19  60  12

④将19和60比较,因为19<60,所以数组还是不变  

   2  3  10  19  60  12

⑤最后将60和12比较,因为60>12,所以第一次全部相邻比较的结果得到最大值60


第一次将最后两个数比较完之后数组变为 2  3  10  19  12  60


接下来对剩下的 2  3  10  19  12 进行相同的操作就得到了

2  3  10  12  19  60


开不开心?惊不惊喜?刺不刺激?


 

微信图片_20220420143112.jpg

代码实现

02

#include<stdio.h>

int swap(int *p, int *q);           //交换比较的两个数

int main()

{

   int i, j, len, a[100];

   

   printf("please input the length!");//输入你想排序的数据的个数

   scanf("%d", &len);

   printf("please input the integers you want to sort:\n");

   for (i = 0; i < len; ++i)

   {

       scanf("%d", &a[i]);         //一个个输入你想排列的数据

   }

   

   for (i = 1; i <= len; ++i)         //第一个for循环表示要求多少数据的最大值

   {

       for (j = 0; j < len - i; ++j)    //第二个for循环表示每求一次数据的最大值的过程

       {

           if (a[j] > a[j + 1])

           swap(&a[j], &a[j + 1]);    //降序该如何实现?

       }

   }

   for (j = 0; j < len; ++j)

   {

       printf("  %d", a[j]);

   }

     return 0;

}


int swap(int *p, int *q)

{

   int temp;


   temp = *p;

   *p = *q;

   *q = temp;

}



运行结果

image.gif微信图片_20220420143128.jpg

03

冒泡排序的缺陷

由具体代码我们可以看出:

对n个数的排列,其最坏的情况是倒叙,为此要作n(n-1)/2次交换和比较;最好的情况是顺序,也要做n-1次比较;因此其排序的效率其实并不算高,而且他解决的数据规模也比较小,但作为入门的基础排序方法 其中体现的交换比较思想还是值得大家去思考的。读者可以思考一下,在冒泡排序的基础上是否可以改进一下,例如已经有一定顺序的片段是不是就可以看作一个整体而减少其比较和交换的次数呢?

相关文章
|
30天前
|
算法 搜索推荐 JavaScript
NodeJ实现冒泡算法
NodeJ实现冒泡算法
23 0
|
30天前
|
算法 搜索推荐 Java
Java实现冒泡算法
Java实现冒泡算法
18 0
|
7月前
|
搜索推荐 Java
排序算法-冒泡、选择、堆、插入、归并、快速、希尔
排序算法-冒泡、选择、堆、插入、归并、快速、希尔
15 0
|
30天前
|
存储 算法 搜索推荐
【算法】七大经典排序(插入,选择,冒泡,希尔,堆,快速,归并)(含可视化算法动图,清晰易懂,零基础入门)
【算法】七大经典排序(插入,选择,冒泡,希尔,堆,快速,归并)(含可视化算法动图,清晰易懂,零基础入门)
|
30天前
|
算法 C语言
C语言数组实例(冒泡算法、猜数字)
C语言数组实例(冒泡算法、猜数字)
20 0
|
10月前
|
算法 JavaScript 搜索推荐
[JavaScript] 常用算法介绍「冒泡算法」
JS中的冒泡排序算法(Bubble Sort)是一种简单而常用的排序算法。它通过多次迭代比较相邻的元素,并根据需要交换它们的位置,使得每一轮迭代都能找到当前数据集中的最大(或最小)值,并将其移至合适的位置。
|
10月前
|
存储 算法 搜索推荐
数据结构各内部排序算法总结对比及动图演示(插入排序、冒泡和快速排序、选择排序、堆排序、归并排序和基数排序等)2
数据结构各内部排序算法总结对比及动图演示(插入排序、冒泡和快速排序、选择排序、堆排序、归并排序和基数排序等)2
178 0
|
30天前
|
搜索推荐
排序算法之快排,希尔和冒泡
排序算法之快排,希尔和冒泡
|
7月前
|
搜索推荐
深入探究常用排序算法:冒泡、插入、选择与快速排序
深入探究常用排序算法:冒泡、插入、选择与快速排序
|
10月前
|
算法 C语言
【冒泡排序】冒泡算法-----数字排序
【冒泡排序】冒泡算法-----数字排序
35 0