1. 程式人生 > >插入排序演算法、時間複雜度和穩定性

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

插入排序

演算法原理

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

演算法分析

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

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

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

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

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

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

程式碼實現

/**
 * @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)。

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

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