排序算法系列:插入排序算法

概述

直接插入排序(Straight Insertion Sort)的基本操作是將一個記錄插入到已經排好序的有序表中,從而得到一個新的、記錄數增1的有序表。

– 《大話數據結構》


版權說明

著作權歸作者所有。
商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
本文作者:Q-WHai
發表日期: 2016年3月24日
原文鏈接:https://qwhai.blog.csdn.net/article/details/50968422
來源:CSDN
更多內容:分類 >> 算法與數學


目錄

算法原理分析

從上面的概述中我們也就可以知道了,這裏對數組進行排序的過程需要兩個序列才能完成。
一個待排序的亂序序列,一個是已排序的有序序列。我們現在要要做的就是把亂序的元素一個一個地從亂序列中插入到有序序列中去。就像下面這樣:
這裏寫圖片描述
可是,這裏還是有一些不太好的地方,比較明顯地方就是我們需要額外添加一個輔助數組。如果這個待排序數據比較大,那麼可能添加輔助數組的策略就不能使用了。
這裏我們不難想到,在原始數組中,有這樣的一個等式:整體序列 = 有序序列 + 亂序序列
也就是說我們可以把當前序列數組一分爲二,左邊爲有序,右邊爲亂序。
這裏寫圖片描述
這樣每次從亂序序列中取出第一個元素,從有序列中插入。直到序列整體有序爲止。具體的步驟請參見下面的算法步驟


算法步驟

  1. 默認序列中的第0個元素是有序的(因爲只有一個元素a[0]嘛,自然是有序的);
  2. 從下標爲1(下標從0開始)的元素開始,取當前下標i位置處的元素a[i]保存到一個臨時變量waitInsert裏;
  3. 對前半部分有序序列的循環遍歷,並與waitInsert比較,直到遇到一個比waitInsert小的元素(這裏默認是從小到大排序),此時的下標爲j,那麼現在只要對a[j+1]進行賦值waitInsert即可;
  4. 將待插入元素的下標 i 向後推移一個位置;
  5. 重複進行第2步到第4步,直到亂序序列中的元素被全部插入到有序序列中;
  6. 經過以上5個步驟之後,整體序列必然有序,排序完成。

邏輯實現

/*
     * 排序算法的核心模塊
     * 
     * @param array
     *      待排序數組
     */
    private void sortCore(int[] array) {
        int arraySize = array.length;
        
        for (int i = 1; i < arraySize; i++) {
            int j = i;
            
            int waitInsert = array[i];
            while(j > 0 && waitInsert < array[j - 1]) {
                array[j] = array[j - 1];
                j--;
            }
            
            array[j] = waitInsert;
        }
    }

複雜度分析

排序方法 時間複雜度 空間複雜度 穩定性 複雜性
平均情況 最壞情況 最好情況
插入排序 O(n2) O(n2) O(n) O(n) 穩定 簡單
這裏的最壞的情況和平均情況從代碼中就可以看出來,因爲有兩嵌套的for循環嘛。那麼其最好的情況呢?這個就是對於一個有序的序列來說,不需要進行交換,只是比較了n次,所以這裏最好的時間複雜度就是O(n)。

Ref

  • 《大話數據結構》

Github源碼下載

  • https://github.com/qwhai/algorithms-sort

徵集

如果你也需要使用ProcessOn這款在線繪圖工具,可以使用如下邀請鏈接進行註冊:
https://www.processon.com/i/56205c2ee4b0f6ed10838a6d

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