排序算法篇_冒泡排序法

image

??冒泡排序法(Bubble Sort)是所有排序算法中最簡單、最基本的一種沼死。冒泡排序法的思路就是交換排序着逐,通過相鄰數(shù)據(jù)的交換來達到排序目的。

冒泡排序算法

冒泡排序算法通過多次比較和交換來實現(xiàn)排序意蛀,其排序流程如下:

  1. 對數(shù)組中的各數(shù)據(jù)耸别,依次比較相鄰的兩元素的大小。
  2. 如果前面的數(shù)據(jù)大魚后面的數(shù)據(jù)县钥,就交換這兩個數(shù)據(jù)秀姐。經(jīng)過第一輪的多次比較排序后,變可把最小的數(shù)據(jù)排好若贮。
  3. 再用同樣的方法把剩下的數(shù)據(jù)逐個進行比較省有,最后便可按照從小到大的順序排好數(shù)組各數(shù)據(jù)的順序痒留。

??為了更清晰地理解冒泡排序算法的執(zhí)行過程,這里我們舉一個實際數(shù)據(jù)的例子來一步步的執(zhí)行冒泡排序算法锥咸。對于五個整型數(shù)據(jù) 118狭瞎、101、105搏予、127熊锭、112,這是一組無序的數(shù)據(jù)雪侥。對其執(zhí)行冒泡排序的過程碗殷,如下圖所示。冒泡排序算法執(zhí)行步驟如下:

image
  1. 第1次排序速缨,從數(shù)組的尾部開始向前依次比較锌妻。首先是127和112比較,由于127大于112旬牲,因此將數(shù)據(jù)112向上移動一位仿粹;同理,118和101比較原茅,將數(shù)據(jù)101向前移動一位吭历。此時排序后的數(shù)據(jù)為 101、118擂橘、105晌区、112、127.
  2. 第2次排序通贞,從數(shù)組的尾部開始向前依次比較朗若。由于105和118比較,可以將數(shù)據(jù)105向前移動一位昌罩。此時排序后的數(shù)據(jù)為 101哭懈、105、118茎用、112银伟、127.
  3. 第3次排序,從數(shù)組的尾部開始向前依次比較绘搞。由于 112 和 118 比較,可以將數(shù)據(jù)118向前移動一位傅物。此時排序后的數(shù)據(jù)為 101夯辖、105、112董饰、118蒿褂、127圆米。
  4. 第4次排序,此時啄栓,各個數(shù)據(jù)已經(jīng)按順序排列好娄帖,所以無需再進行數(shù)據(jù)交換,最終排序的結(jié)果為:101昙楚、105近速、112、118堪旧、127削葱。

??從上面的列子,可以非常直觀的了解到冒泡排序算法的執(zhí)行過程淳梦。整個排序過程可以形象的類似于水泡的浮起過程析砸,故因此而得名。冒泡排序算法對 N 個數(shù)據(jù)進行排序時爆袍,無論元數(shù)據(jù)有無順序首繁,都要進行 N-1步的中間排序。這種排序方法思路簡單直觀陨囊,但是缺點就是執(zhí)行的步驟有點長弦疮,效率不是很高。

??一種改進的方法谆扎,就是在每次中間排序后挂捅,比較一下數(shù)據(jù)是否已經(jīng)按照順序排列完成。如果排列完成則退出排序過程堂湖,否則就繼續(xù)進行冒泡排序闲先。這樣,對于數(shù)據(jù)比較有規(guī)則的无蜂,可以加速算法執(zhí)行過程伺糠。

冒泡排序算法的示例代碼如下:


void bubbleSort(int[] datas) {
        int temp;
        for (int i = 1; i < datas.length; i++) {
            for (int j = 0; j < datas.length - i; j++) {
                if (datas[j] > datas[j + 1]) {
                    temp = datas[j];
                    datas[j] = datas[j + 1];
                    datas[j + 1] = temp;
                }
            }
            System.out.print("第" + i + "步排序結(jié)果:");
            for (int k = 0; k < datas.length; k++) {
                System.out.print(" " + datas[k]);
            }
            System.out.print("\n");
        }
    }

??在這里,輸入?yún)?shù)datas一般為一個數(shù)組的首地址斥季。待排序的原數(shù)據(jù)便保存在數(shù)組 datas中训桶,程序中通過兩層循環(huán)來對數(shù)據(jù)進行冒泡排序。我們可以結(jié)合前面的冒泡排序算法加深理解酣倾。

冒泡排序算法實例

??有了前面的冒泡排序算法的基本思想和算法之后舵揭。這里通過一個完整的例子說明冒泡排序法在整型數(shù)組中的應(yīng)用,程序代碼如下:


public class BubbleSort {

    static final int SIZE = 10;

    public static void bubbleSort(int[] datas) {
        int temp;
        for (int i = 1; i < datas.length; i++) {
            for (int j = 0; j < datas.length - i; j++) {
                if (datas[j] > datas[j + 1]) {
                    temp = datas[j];
                    datas[j] = datas[j + 1];
                    datas[j + 1] = temp;
                }
            }
            System.out.print("第" + i + "步排序結(jié)果:");
            for (int k = 0; k < datas.length; k++) {
                System.out.print(" " + datas[k]);
            }
            System.out.print("\n");
        }
    }

    public static void main(String[] args) {
        int[] datas = new int[SIZE];
        int i;
        for (i = 0; i < SIZE; i++) {
            datas[i] = (int) (100 + Math.random() * (100 + 1));
        }
        System.out.print("排序前的數(shù)組為:\n");
        for (i = 0; i < SIZE; i++) {
            System.out.print(datas[i] + " ");
        }
        System.out.print("\n");
        bubbleSort(datas);
        System.out.print("排序后的數(shù)組為:\n");
        for (i = 0; i < SIZE; i++) {
            System.out.print(datas[i] + " ");
        }
    }
}    

??在這里躁锡,程序定義符號常亮SIZE午绳,用于表示需要排序的整型數(shù)組的大小。在主方法中映之,首先定義一個整型數(shù)組拦焚,對數(shù)組進行隨機初始化蜡坊,并輸出數(shù)組內(nèi)容。接著調(diào)用冒泡排序算法的方法對數(shù)組排序赎败。最后秕衙,輸出排序后的數(shù)組。

??程序的執(zhí)行結(jié)果如下圖所示僵刮。這里据忘,顯示了每一步的排序結(jié)果。從中可以看出從第六步開始妓笙,便已經(jīng)完成對數(shù)據(jù)的排序若河,但算法還是進行了后續(xù)的比較步驟。通過前面的說明寞宫,加入判斷部分萧福,使其盡早的將誒書排序過程,從而提高執(zhí)行效率辈赋。

image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鲫忍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子钥屈,更是在濱河造成了極大的恐慌悟民,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件篷就,死亡現(xiàn)場離奇詭異射亏,居然都是意外死亡,警方通過查閱死者的電腦和手機竭业,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門智润,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人未辆,你說我怎么就攤上這事窟绷。” “怎么了咐柜?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵兼蜈,是天一觀的道長。 經(jīng)常有香客問我拙友,道長为狸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任遗契,我火速辦了婚禮钥平,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己涉瘾,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布捷兰。 她就那樣靜靜地躺著立叛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贡茅。 梳的紋絲不亂的頭發(fā)上秘蛇,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音顶考,去河邊找鬼赁还。 笑死,一個胖子當(dāng)著我的面吹牛驹沿,可吹牛的內(nèi)容都是我干的艘策。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼渊季,長吁一口氣:“原來是場噩夢啊……” “哼朋蔫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起却汉,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤驯妄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后合砂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體青扔,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年翩伪,在試婚紗的時候發(fā)現(xiàn)自己被綠了微猖。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡幻工,死狀恐怖励两,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情囊颅,我是刑警寧澤当悔,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站踢代,受9級特大地震影響盲憎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜胳挎,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一饼疙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧慕爬,春花似錦窑眯、人聲如沸屏积。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炊林。三九已至,卻和暖如春卷要,著一層夾襖步出監(jiān)牢的瞬間渣聚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工僧叉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留奕枝,地道東北人。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓瓶堕,卻偏偏與公主長得像隘道,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子捞烟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容