1. 程式人生 > >演算法 氣泡排序小述

演算法 氣泡排序小述

一、概述

本節主要簡單介紹一下氣泡排序演算法,氣泡排序需要重複地走訪待排序的元素列,依次比較兩個相鄰的元素,如果他們的順序(如從大到小、首字母從A到Z)錯誤就把他們交換過來。走訪元素的工作要重複地進行直到沒有相鄰元素需要交換為止,也就是說該元素已經排序完成。摘自百度百科

二、分析

根據定義我們知道,氣泡排序的基本思想就是每次比較兩個相鄰的元素,如果它們的順序錯誤就把它們交換過來。下面我們就以陣列array為例,待排序陣列array[12, 35, 99, 18 ,76],現在我們將它從大到小進行排列:

(1)第一輪

第一次比較:我們比較第1位和第0位的大小,現在第1位35,第0位12,所以互動位置

在這裡插入圖片描述

第二次比較:我們比較第2位和第1位的大小,現在第2位是99,第1位是12,所以我們交換位置

在這裡插入圖片描述

第三次比較:我們比較第3位和第2位的大小,現在第3位是18,第2位是12,所以我們交換位置

在這裡插入圖片描述

第四次比較:我們比較第4位和第3位的大小,現在第4位是76,第3位是12,所以我們交換位置

在這裡插入圖片描述

經過4次比較,我們發現最小的數字已經就位,在這個過程中,12就如同一個氣泡一般不斷的向後翻滾,直至就位。同時我們也發現一輪的比較只能將一個數字歸位。既然如此,接下來我們就進行下一輪的比較,將第2小的數字歸位

(2)第二輪

第一次比較:我們比較第1位和第0位,第1位是99,第0位是35,則互動位置

在這裡插入圖片描述

第二次比較:我們比較第2位和第1位,第2位是18,第1位是35,則不需要交換

在這裡插入圖片描述

第三次比較:我們比較第3位和第2位,第3位是76,第2位是18,則需要交換

在這裡插入圖片描述

經過3次比較,第2小的數字就已經就位了。因為已經歸位的數字就無需我們再比較了,所以我們只需要比較3次即可。接下來讓第3小的數字歸位也是同樣的方法

(3)第三輪

第一次比較:我們比較第1位和第0位,第1位是35,第0位是99,則我們交換位置

在這裡插入圖片描述

第二次比較:我們比較第2位和第1位,第2位76,第1位35,則我們交換位置

在這裡插入圖片描述

經過2次比較,我們發現第3小的數字已經就位,同樣的第四輪的比較,方法也是一樣的

(4)第四輪

第一次比較:我們比較第1位和第0位,第1位是76,第0位是99,則我們不需要交換位置

在這裡插入圖片描述

經過1次比較,我們發現第4小的數字已經就位,這也就意味著,我們的陣列array到此已經排序完畢。

試想,如果我們的陣列array具有n個數字需要排序呢?根據上面的思路我們能夠知道,我們只需要將n-1個數字歸位即可,即進行比較(n-1)輪;而每一輪的比較(n-1-輪數)次(或者次數也可以說是n-1-歸位數字個數),在這裡為什麼需要減1,我覺得這樣來想比較好理解:因為我們每次比較都是從第1位開始比較的,例如第1位跟第0位比,第2位跟第1位比…,而第0位不需要比較(可以想象第0位與-1位比較,但-1位不存在,所以光第0位則不需要比較了)

三、程式碼展示

氣泡排序的核心部分就是雙重巢狀迴圈,外層控制需要進行比較的輪數,內層表示每輪需要進行比較的次數,程式碼如下

    private static int[] bubbleSort(int[] array) {
        int length = array.length;
        for(int i=0; i<length-1; i++){
            for(int j=1; j<length-i; j++){
                // 由大到小排序,如果右側比左側大,則互換位置
                if(array[j] > array[j-1]){
                    int temp = array[j-1];
                    array[j-1] = array[j];
                    array[j] = temp;
                }
            }
        }
        return array;
    }

四、總結

當然程式碼編寫並不是固定的,肯定會有很多變形格式,其實我們研究的也是其冒泡的思想和每種寫法的效率問題。如果想要檢視更多演算法基礎,去我的部落格目錄裡檢視吧,因為關於每塊知識點的介紹,部落格單節寫的比較零散,不容易查詢。