1. 程式人生 > >決勝經典演算法之氣泡排序

決勝經典演算法之氣泡排序

本篇是《決勝經典演算法》系列文章的第一篇,作為開篇,先向各位讀者說明一下本系列的幾個“原則”。

  1. 由淺入深:剛一開始將會分享很易懂、易於理解的演算法。比如本文講述的氣泡排序法就可以稱得上是最為簡單的演算法了;
  2. 思路優先,程式碼為輔:對於任何一種演算法,可以說思路是最重要的。有了思路,相當於成功了一半。另外,雖然不同的程式語言的語法等有所差異,但解題思路是大體一致的。因此,在擺出實際程式碼前,會詳細地說明解題思路;
  3. 更易理解的圖示:本系列文章會盡可能地多采用圖示甚至動圖來解釋演算法中的每一步,讓讀者理解起來更加直觀。

第一部分,我們來聊一聊排序。單說排序演算法,有近十種。不同的演算法對應不同的應用場景(有關不同排序演算法的效能比較,將在完整介紹完10種排序演算法後統一說明)。
閒話少說,接下來我們就來看第一種排序演算法,也是本系列中最為簡單的一種演算法——氣泡排序法。

問題挑戰

現有如下數字:
3,44,38,5,47,15,36,26,27,2,46,4,19,50,48
一共15個數字,請將其從小到大依次排列。

演算法解析

所謂“氣泡排序”,可以從名稱上理解。“冒泡”實際上就是指把值更大的元素放到數列的後面來(如果是從大到小排列,則反之),好像是這個元素“浮”了過來。我們先來大致地看下面的動圖,感受一下氣泡排序的執行過程:

怎麼樣?有沒有感覺到一個個值更大的元素一點點地“冒泡”到了右端?
是不是有點眼花繚亂?彆著急,下面我們逐步拆解。

詳細步驟

我們來看一下氣泡排序的詳細步驟:

  1. 比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
  2. 對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
  3. 針對所有的元素重複以上的步驟,除了最後一個。
  4. 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。

虛擬碼

有了詳細步驟,我們就可以使用虛擬碼實現了,參考下面的虛擬碼:

BubbleSort(input ele[],input length)  
    for i <- 1 to length step 1  
        for j <- i+1 to 0 step -1  
            if ele[j] < ele [j - 1]  
                swap (ele[j],ele[j - 1])  
            end if  
    end   
end

Java程式碼實現

下面啟動IDE,使用Java程式語言實現它吧!

public void bubbleSort(int[] arr) {
    for (int i = 1; i < arr.length; i++) {
        for (int j = 0; j < arr.length - i; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

上述程式碼中,引數arr表示未經排序的數列。該方法執行結束後,arr將變為從小到大排序的數列。

思考題

  1. 如果要實現從大到小排列,上述程式碼該做如何修改呢?

思考題答案將在下篇連載中公佈,大家加油哦!