【算法基礎】關於冒泡,咱們來排個序

寫在前面編程

一首《海闊天空》送給全部在外求學的遊子。「今天我,寒夜裏看雪飄過~~~」那麼請問如何讓大小不一的雪有順序的排列呢?額,是否是有點扯遠了……嗯,下面開始咱們今天的(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源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索