天天看點

2021-01-08算法之冒泡排序

算法之冒泡排序

冒泡排序是面試經常問到的,之前在網上看到的冒泡排序都是雙層for循環來實作的,最近在看書,《資料結構與算法圖解》中,關于冒泡排序的寫法是while循環嵌套for循環的,我覺得這種寫法更加好了解,下面記錄下來,以供學習:

public static void main(String[] args) {
        //冒泡排序寫法
        int[] arr = {12,3,45,33,4,25};
        //index:表示:該索引之前的資料都沒排過序”。一開始整個數組都是沒排過序的,是以此變量指派為數組的最後一個索引
        int index = arr.length-1;
        //flag:被用來記錄數組是否已完全排好序。當然一開始它應該是False。
        boolean flag = false;

        /**
         * 接着是一個while循環,除非數組排好了序,不然它不會停下來。
         * 然後,我們先将flag初步設定為True。當發生任何交換時,我們會将其改為False。
         * 如果在一次輪回裡沒有做過交換,那麼flag就确定為True,我們知道數組已排好序了。
         */
        while (!flag) {
            flag = true;

            /**
             * 在while循環裡,還有一個for循環會疊代未排序元素的索引值。
             * 此循環中,我們會比較相鄰的元素,如果有順序錯誤,就會進行交換,并将flag改為False。
             */
            for (int i = 0; i < index; i++) {
                if(arr[i] > arr[i+1]) {
                    int temp = arr[i];
                    arr[i] = arr[i+1];
                    arr[i+1] = temp;
                    flag = false;
                }
            }
            /**
             * 到了這一行,就意味着一次輪回結束了,同時該次輪回中冒泡到右側的值處于正确位置。
             * 因為index所指的位置已放上了正确的元素,是以減1,以便下一次輪回能略過該位置
             */
            index = index-1;
        }
        //一次while循環就是一次輪回,循環會持續直至flag确定為True。

        //debug調試可以檢視arr已經是排序好(升序)
        System.out.println(arr);
    }