[資料結構與演算法]-排序演算法之插入排序(insertion sort)及其實現(Java)

喝酒不騎馬發表於2018-07-01

本文歡迎轉載,轉載前請聯絡作者,經允許後方可轉載。轉載後請註明出處,謝謝! http://blog.csdn.net/colton_null 作者:喝酒不騎馬 Colton_Null from CSDN


一.什麼是插入排序?

插入排序(insertion sort)是最簡單的排序演算法之一。它是一個穩定的排序演算法

(Tips:所謂穩定,即兩個相同元素,排序前和排序後他倆的順序不發生改變。當然,這跟具體實現有一定關係。)

如果一個陣列由N個元素組成,則插入排序由N - 1趟排序組成。對於p = 1到N - 1趟,插入排序保證從位置0到位置p上的元素為已排序狀態。

即第一趟,從下標1處元素進行排序,保證陣列0~1位置上的元素有序。
第二趟,從下標2處元素進行排序,保證陣列0~2位置上的元素有序。
……
第N - 1趟,從下標N - 1處元素進行排序,保證陣列0~N - 1位置上的元素有序。到此,整個陣列排序完畢。

二.插入排序的舉例實踐

對於陣列[46, 34, 32, 12, 14, 9]

  • p = 1趟之後:[34, 46, 32, 12, 14, 9]
  • p = 2趟之後:[32, 34, 46, 12, 14, 9]
  • p = 3趟之後:[12, 32, 34, 46, 14, 9]
  • p = 4趟之後:[12, 14, 32, 34, 46, 9]
  • p = 5趟之後:[9, 12, 14, 32, 34, 46]

三.插入排序復程式碼實現

InsertionSort.java

public class InsertionSort {

    /**
     * InsertionSort 插入排序
     *
     * @param arr 被排序的陣列
     * @param <T>
     */
    public static <T extends Comparable<? super T>> void insertionSort(T[] arr) {
        int p;
        for (int i = 1; i < arr.length; i++) {
            // 儲存當前訪問的節點值
            T tmp = arr[i];
            for (p = i; p > 0 && tmp.compareTo(arr[p - 1]) < 0; p--) {
                // 如果tmp小於arr[p - 1]的值,則後移一位
                arr[p] = arr[p - 1];
            }
            // 將tmp替換p位置的值(上面的for已經將原來的p後移了)
            arr[p] = tmp;
        }
    }
}

InsertionSortTest.java 測試類

public class InsertionSortTest {
    public static void main(String[] args) {
        Integer[] arr = {46, 34, 32, 12, 14, 9};
        InsertionSort.insertionSort(arr);
        print(arr);
    }


    private static <T> void print(T[] arr) {
        for (T t : arr) {
            System.out.print(t.toString() + " ");
        }
        System.out.println();
    }
}

測試陣列:[46, 34, 32, 12, 14, 9]
輸出:9 12 14 32 34 46

四.插入排序演算法複雜度分析

最壞情況,陣列為倒序,巢狀迴圈的每次迴圈都要消耗N次迭代,因此插入排序的時間複雜度為O(N²)。
理想情況下,如果陣列已經是排序好的情況,時間複雜度則為O(N)。

插入排序過程使用了i、p、tmp三個輔助變數,與問題規模無關,所以空間複雜度為O(1)。


有關[資料結構與演算法]的學習內容已經上傳到github,喜歡的朋友可以支援一下。 data-structures-and-algorithm-study-notes-java


站在前人的肩膀上前行,感謝以下部落格及文獻的支援。

相關文章