排序(三)冒泡排序

本節主要簡單介紹一下冒泡排序算法,冒泡排序需要重複地走訪待排序的元素列,依次比較兩個相鄰的元素,如果他們的順序(如從大到小、首字母從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;
    }

四、總結

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章