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

写在前面编程

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



数组


微信


url


spa


1.     冒泡排序的基本原理.net

2.     实现的具体代码orm

3.     冒泡排序的缺陷blog


排序



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


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


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



 

代码实现

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;

}


运行结果

03

冒泡排序的缺陷

由具体代码咱们能够看出:

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


好了,最后安利一波广告:你的支持即是咱们最大的动力,快扫码关注咱们程序猿声吧!



END

编辑 /华南理工大学本科一年级@李锐标

排版 /华中科技大学本科一年级@邓发珩


若有疑问,欢迎咨询:李锐标 (联系方式:2961347734@qq.com 公众号:程序猿声)





本文分享自微信公众号 - 程序猿声(ProgramDream)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索