1. 程式人生 > 其它 >java實現氣泡排序-通俗易懂

java實現氣泡排序-通俗易懂

自己寫的筆記可能有不對的地方,希望大佬指正!
先說思路假設有一個數組是arr = [24, 69, 80, 57, 13],分別對應的下標是[0, 1, 2, 3, 4]現在需要把最大的數字放在最後面,就排序成[13, 24, 57, 69, 80],看樣子非常簡單。


那麼進行第一次排序,24和69排序,下標0對應的是24,和下標1對應的69進行比較。

小的放在左邊,大的放在右邊,那麼這裡就不變,這裡直接舉例子80和57的位置。

80對應的下標是2,57對應的下標是3,現在80比57大所以需要把57變換到80的位置也就是下標變化。

所以需要做的就是把2的下標80變成57,3的下標57變成80就進行了一次交換。

然後就變成了80和13的交換,80比13大,首先80現在的下標是3,13的下標是4。

那麼就需要把4的下標13變成80,3的下標80變成13就可以進行了交換,如下交換流程。

從左到右比較


第一輪比較:目標大的放在最後面

第一次比較[24, 69, 80, 57, 13]

第二次比較[24, 69, 80, 57, 13]

第三次比較[24,69,57,80,13]

第四次比較[24, 69, 57, 13, 80]


第二輪比較:目標把第二大的數放在倒數第二的位置

第一次比較[24, 69, 57, 13, 80]

第二次比較[24, 57, 69, 13, 80]

第三次比較[24, 57, 13, 69, 80]


第三輪比較:目標把第三大的數放在倒數第三的位置

第一次比較[24, 57, 13, 69, 80]

第二次比較[24, 13, 57, 69, 80]


第四輪比較:目標把第四大的數放在倒數第四的位置

第一次比較[13, 24, 57, 69, 80]


到這裡可以發現進行了四輪比較,每一輪比較裡面還有比較數字的操作,這裡可以簡單進行程式碼,如下圖就實現了第一輪迴圈,輸出是

24 69 57 13 80 ,如果我們需要進行第二輪比較只需要把迴圈的 j < 4變成 j < 3即可

package chapter6.氣泡排序;

public class maopao {
    public static void main(String[] args) {
        int arr[] = {24, 69, 80, 57, 13};
        //定義temp變數
        int temp = 0;
        for (int j = 0; j < 4; j++) {
            //假設這裡是第一次迴圈j為0那麼就判斷的是arr[0] > arr[1]
            //也就是判斷24 > 69
            if (arr[j] > arr[j + 1]) {
                //進行轉換操作,稍微看看還是能看懂的因為進行兩個數字轉換
                //需要用到變數
                temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
        //輸出每次交換過後的數字
        for (int j = 0; j < arr.length; j++) {
            System.out.print(arr[j] + "\t");
        }
        //每次輸出完之後換行
        System.out.println();
    }
}

如果要實現第二輪就可以直接把第一輪的程式碼再複製一遍即可,但是太麻煩了,所以這裡就需要用到二層迴圈,因為有四輪迴圈,所以程式碼如下,就已經實現了程式碼,但是現在需要把程式碼變活,萬一陣列變了怎麼辦。

package chapter6.氣泡排序;

public class maopao {
    public static void main(String[] args) {
        int arr[] = {24, 69, 80, 57, 13};
        //定義temp變數
        int temp = 0;
        //增加外層迴圈,因為有四輪迴圈所以迴圈四次
        for (int i = 0; i < 4; i++) {
            /*
            * 每次迴圈完成之後需要減去一個1
            * 因為第第一輪比較已經比較完成,也就是第一個最大的數已經出來了
            * 就需要第二個最大的數字,就所以減去一個1,但是第一次迴圈的時候
            * 時候不需要減去,所以就減去0即可
            *
            * */
            for (int j = 0; j < 4 - i; j++) {
                //假設這裡是第一次迴圈j為0那麼就判斷的是arr[0] > arr[1]
                //也就是判斷24 > 69
                if (arr[j] > arr[j + 1]) {
                    //進行轉換操作,稍微看看還是能看懂的因為進行兩個數字轉換
                    //需要用到變數
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
            //輸出每次交換過後的數字
            for (int j = 0; j < arr.length; j++) {
                System.out.print(arr[j] + "\t");
            }
            //每次輸出完之後換行
            System.out.println();
        }


    }
}

修改程式碼如下。

package chapter6.氣泡排序;

public class maopao {
    public static void main(String[] args) {
        int arr[] = {24, 69, 80, 57, 13};
        //定義temp變數
        int temp = 0;
        //增加外層迴圈,因為有四輪迴圈所以迴圈四次
        /*
        *       這裡四次可以發現是陣列長度減1
        * 可以把i < 4修改為 i < i < arr.length - 1
        *
        * */
        for (int i = 0; i < arr.length - 1; i++) {
            /*
            * 每次迴圈完成之後需要減去一個1
            * 因為第第一輪比較已經比較完成,也就是第一個最大的數已經出來了
            * 就需要第二個最大的數字,就所以減去一個1,但是第一次迴圈的時候
            * 時候不需要減去,所以就減去0即可
            *
            * */
            /*
            *       這裡四次和上面一樣
            *
            * */
            for (int j = 0; j < arr.length - 1 - i; j++) {
                //假設這裡是第一次迴圈j為0那麼就判斷的是arr[0] > arr[1]
                //也就是判斷24 > 69
                if (arr[j] > arr[j + 1]) {
                    //進行轉換操作,稍微看看還是能看懂的因為進行兩個數字轉換
                    //需要用到變數
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
            System.out.print("======第"+(i + 1)+"輪比較======" + "\n");
            //輸出每次交換過後的數字
            for (int j = 0; j < arr.length; j++) {
                System.out.print(arr[j] + "\t");
            }
            //每次輸出完之後換行
            System.out.println();
        }


    }
}