插入排序算法、時間複雜度和穩定性

插入排序

算法原理

  • 將數據分爲有序部分和無序部分。
  • 在無序部分選擇一個元素,按照順序插入到有序部分,使之有序。
  • 直到無序部分都插入到有序部分結束。

算法分析

排序的思想就是維護一個有序的部分,將無序部分的數據按照順序插入到有序部分。

通俗的講,插入排序的原理就是:

先將最後一個元素作爲有序部分,前面元素作爲無序部分,將倒數第二個元素和最後一個元素比較,如果倒數第二個元素大於最後一個元素,則將倒數第二個元素查到最後一個元素的位置。

此時無序部分是第一個元素到倒數第三個元素,有序部分是最後兩個元素。

再將倒數第三個元素按照順序插入到最後兩個元素中,使得最後三個元素成爲有序部分。

重複上面的插入規則,直到無序部分爲空爲止。

代碼實現

/**
 * @Title: insertSort
 * @Description: 插入排序
 * @param: array
 */
public static void insertSort(int[] array) {
    int n = array.length;
    for (int i = 0; i < n - 1; i++) {
        // 標記無序部分最後一個元素,作爲待插入元素
        int k = n - 1 - i - 1;
        int j;
        // 遍歷有序部分,將array[k]與有序部分元素進行比較
        for (j = k + 1; j < n; j++) {
            // 找出待插入元素的位置 j-1
            if (array[k] <= array[j]) {
                break;
            }
        }
        // 將待插入元素插入到有序部分
        if (k != j - 1) {
            insertItem(array, k, j - 1);
        }
    }
}

/**
 * @Title: insertItem
 * @Description: 把數組array下標爲i的元素插入到下標爲j的位置
 * @param: array
 * @param: i
 * @param: j
 */
private static void insertItem(int[] array, int i, int j) {
    int temp = array[i];
    for (int k = i + 1; k <= j; k++) {
        array[k - 1] = array[k];
    }
    array[j] = temp;
}

時間複雜度和算法穩定性

從代碼中可以看出一共遍歷了n-1 + n-2 + … + 2 + 1 = n * (n-1) / 2 = 0.5 * n ^ 2 - 0.5 * n,那麼時間複雜度是O(N^2)。

因爲在有序部分元素和待插入元素相等的時候,可以將待插入的元素放在前面,所以插入排序是穩定的。

相關代碼都在github上:https://github.com/LebronChenX/sort

喜歡這篇文章的朋友,歡迎長按下圖關注公衆號lebronchen,第一時間收到更新內容。
掃碼關注

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