4.插入排序

4.插入排序


前言

插入排序的效果就像將一個數組模擬成兩個數組的在選擇、插入的過程。


實現思路

假設在下標 i 之前的是數都已經排好了順序( 0 … i-1 ),那麼此次需要找到 i 位置的數的正確位置 k 。在尋找這個位置 k 的過程中,逐個比較 i 之前排好順序的數組,先比較最大的 i-1 位置的數(因爲有序,所以 i 以前的數, i-1 是最大的),在尋找的過程中,比較的數大於當前 i 位置的數 ,那麼比較的數置後一個位置,那麼在有序數組中會一直“騰位置”,那麼一直一直找,當找到比 i 位置小的數時,插入到這個數的後面即可,完成一趟插入。


模擬走位

上面說的很麻煩,直接看走位比較好 T T 。

初始數組:[ 11 , 31 , 12 , 5 , 34 , 30 , 26 , 38 , 36 , 18 ]

第一趟:[ 11 , 31 , 12 , 5 , 34 , 30 , 26 , 38 , 36 , 18 ] ( 無移動的元素 )

第二趟:[ 11 , 12 , 31 , 5 , 34 , 30 , 26 , 38 , 36 , 18 ] ( 31 向後移動 )

第三趟:[ 5 , 11 , 12 , 31 , 34 , 30 , 26 , 38 , 36 , 18 ] ( 11 , 12 , 31 皆向後移動 )

第四趟:[ 5 , 11 , 12 , 31 , 34 , 30 , 26 , 38 , 36 , 18 ] ( 無移動的元素 )

第五趟:[ 5 , 11 , 12 , 30 , 31 , 34 , 26 , 38 , 36 , 18 ] ( 31 , 34 向後移動 )

第六趟:[ 5 , 11 , 12 , 26 , 30 , 31 , 34 , 38 , 36 , 18 ] ( 30 , 31 , 34 向後移動 )

第七趟:[ 5 , 11 , 12 , 26 , 30 , 31 , 34 , 38 , 36 , 18 ] ( 無移動的元素 )

第八趟:[ 5 , 11 , 12 , 26 , 30 , 31 , 34 , 36 , 38 , 18 ] ( 38 向後移動 )

第九趟:[ 5 , 11 , 12 , 18 , 26 , 30 , 31 , 34 , 36 , 38 ] ( 26 , 30 , 31, 34 , 36 , 38 向後移動 )

總結:插入排序會比選擇排序更優秀,以爲它能利用排序過程中部分數有序的優勢,減少一些不必要的比較,是否優秀取決於數組的初始順序。

如果給定的數組是倒序,那麼就是最壞的情況下了,比較次數:1 + 2 + … ( n-1 ) + n = ( n+1 ) / 2。是一個不穩定的排序,依賴着數組的初始順序。


實現代碼

    public <T extends Comparable<T>> T[] insertSorting(T[] array) {
        int len = array.length;
        // 每個元素選取出來作爲插入元素
        for (int i = 0; i < len; i++) {
            T toInsert = array[i];
            int j = i;
            for (; j > 0; j--) {
                /**
                 * 原來順序系列裏從最大的數開始  和 現在選擇的比較
                 * 如果找到比選擇的數小的 break
                 * 此時已經記下了 座標 保存到 j 中
                 */
                if (array[j - 1].compareTo(toInsert) <= 0) {
                    break;
                }
                /**
                 * 如果一直沒找到j的位置 那麼就是 選擇到的元素一直比較小
                 * 那麼一直騰位置
                 */
                array[j] = array[j - 1];
            }
            //如果此時 j = 0 說明了 順序序列裏沒有比選擇元素小的
            array[j] = toInsert;
            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[]) {
        /**
         * 插入排序
         */
        InsertSort insertSort = new InsertSort();
        System.out.println("\n插入排序\n");
        Integer[] object = {11, 31, 12, 5, 34, 30, 26, 38, 36, 18};
        Integer[] result = insertSort.insertSorting(object);
        System.out.println("");
        System.out.println("\n插入排序\n");
        for (int i : result) {
            System.out.print(i + " ");
        }
        System.out.println("");
        System.out.println("\n插入排序\n");
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章