3.選擇排序

3.選擇排序


前言

選擇排序的含義就是因爲每一次最內層for走一趟都會選擇出一個最大或最小的數。


實現思路

比如有N個數,開始先選取第一個數( i= 0 )作爲基準數。然後拋開這個數以以前的數,右邊的數( i+1 To n-1 )走一趟for,找出最小(最大也行,看你是要升序還是降序),然後拿到這個最小的數,和基準數交換。然後下一次又重新定位基準數 i + 1,繼續走右邊的數一趟,找到最值,繼續交換…….如此反覆。


模擬走位

初始數組: [38, 17, 16, 16, 7, 31, 39, 32, 2, 11]

i = 0 :[ 2 , 17 , 16 , 16 , 7 , 31 , 39 , 32 , 38 , 11 ] ( 0th [38]<->8th [2] )

i = 1 :[ 2 , 7 , 16 , 16 , 17 , 31 , 39 , 32 , 38 , 11 ] ( 1st [17]<->4th [7] )

i = 2 :[ 2 , 7 , 11 , 16 , 17 , 31 , 39 , 32 , 38 , 16 ] ( 2nd [11]<->9th [16] )

i = 3 :[ 2 , 7 , 11 , 16 , 17 , 31 , 39 , 32 , 38 , 16 ] ( 無需交換 )

i = 4 :[ 2 , 7 , 11 , 16 , 16 , 31 , 39 , 32 , 38 , 17 ] ( 4th [17]<->9th [16] )

i = 5 :[ 2 , 7 , 11 , 16 , 16 , 17 , 39 , 32 , 38 , 31 ] ( 5th [31]<->9th [17] )

i = 6 :[ 2 , 7 , 11 , 16 , 16 , 17 , 31 , 32 , 38 , 39 ] ( 6th [39]<->9th [31] )

i = 7 :[ 2 , 7 , 11 , 16 , 16 , 17 , 31 , 32 , 38 , 39 ] ( 無需交換 )

i = 8 :[ 2 , 7 , 11 , 16 , 16 , 17 , 31 , 32 , 38 , 39 ] ( 無需交換 )

i = 9 :[ 2 , 7 , 11 , 16 , 16 , 17 , 31 , 32 , 38 , 39 ] ( 無需交換 )

總結:選擇排序隨着 i 的 增大,比較次數也相應的減少了,無論數組是否有序,都會從 數組的開始 到 數組結束進行一次比較。次數也是固定的 n + (n-1) + … + 2 + 1,而交換的次數也和初始化數組的排序有關。

所以:最壞的情況是,n次;最好的情況是,0次。


實現代碼

    public <T extends Comparable<T>> T[] selectionSorting(T[] array, boolean ascend) {
        // 取得數組長度
        int len = array.length;
        //逐個選擇比較
        for (int i = 0; i < len; i++) {
            int selected = i;
            /**
             * 與選擇後的 其他元素比較
             * Comparable.compareTo() 方法
             * -1 : 小於
             *  0 : 等於
             *  1 : 大於
             */
            for (int j = i + 1; j < len; j++) {
                int compare = array[j].compareTo(array[selected]);
                /**
                 *  如果
                 *  array[j] != array[selected]
                 *  並且
                 *  array[j] 小於 array[selected]
                 *  都成立的時候
                 */
                if ((compare != 0 && compare < 0) == ascend) {
                    selected = j;
                }
            }

            /**
             * 基準數 和 被選擇的交換
             * 當然要是沒找到選擇的數,那麼被選擇數一直沒變是i
             * 也就是基準數自己和自己的交換
             */
            T t = array[i];
            array[i] = array[selected];
            array[selected] = t;
            System.out.print("i = " + i + "  array = ");
            for (T data : array) {
                System.out.print(data + " ");
            }
            System.out.println("");
        }
        return array;
    }

運行

    public static void main(String[] args) {
        /**
         * 選擇排序
         */
        SelectionSort selectionSorting = new SelectionSort();
        Integer[] object = {38, 17, 16, 16, 7, 31, 39, 32, 2, 11};
        System.out.println("\n選擇排序\n");
        Integer[] result = selectionSorting.selectionSorting(object, true);
        System.out.println("\n選擇排序\n");
        for (int i : result) {
            System.out.print(i + " ");
        }

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