1. 程式人生 > 實用技巧 >演算法【插入排序】

演算法【插入排序】

簡介:

插入排序,一般也被稱為直接插入排序。對於少量元素的排序,它是一個有效的演算法。插入排序是一種最簡單的排序方法,它的基本思想是將一個記錄插入到已經排好序的有序表中,從而一個新的、記錄數增1的有序表。在其實現過程使用雙層迴圈,外層迴圈對除了第一個元素之外的所有元素,內層迴圈對當前元素前面有序表進行待插入位置查詢,並進行移動。

思想

將一個記錄插入到已排好序的序列中,從而得到一個新的有序序列(將序列的第一個資料看成是一個有序的子序列,然後從第二個記錄逐個向該有序的子序列進行有序的插入,直至整個序列有序)。

重點:使用哨兵,用於臨時儲存和判斷陣列邊界。

將亂序序列假設分為兩部分

  • 有序部分:序列中的第一個元素

  • 無序部分:序列中非第一個元素

  • [3,6,4,2,7,1]

  • 3是有序部分,剩下元素為無序部分

  • 需要將無序部分的元素逐一的插入到有序部分中,最終變為有序序列

Python程式碼

def sort(alist):
    for i in range(1,len(alist)):
        while i > 0:
            if alist[i] < alist[i-1]:
                alist[i],alist[i-1] = alist[i-1],alist[i]
                i -= 1
            else:
                break
    return alist
alist = [9,8,7,6,5,4,3,2,1]
print(sort(alist))

>>>
[1, 2, 3, 4, 5, 6, 7, 8, 9]

時間複雜度

在插入排序中,當待排序陣列是有序時,是最優的情況,只需當前數跟前一個數比較一下就可以了,這時一共需要比較N- 1次,時間複雜度為O(n)。

最壞的情況是待排序陣列是逆序的,此時需要比較次數最多,總次數記為:1+2+3+…+N-1,所以,插入排序最壞情況下的時間複雜度為O(n^2)。

平均來說,A[1..j-1]中的一半元素小於A[j],一半元素大於A[j]。插入排序在平均情況執行時間與最壞情況執行時間一樣,是輸入規模的二次函式。

空間複雜度

插入排序的空間複雜度為常數階O(1)。

穩定性分析

如果待排序的序列中存在兩個或兩個以上具有相同關鍵詞的資料,排序後這些資料的相對次序保持不變,即它們的位置保持不變,通俗地講,就是兩個相同的數的相對順序不會發生改變,則該演算法是穩定的;如果排序後,資料的相對次序發生了變化,則該演算法是不穩定的。關鍵詞相同的資料元素將保持原有位置不變,所以該演算法是穩定的。

應用分析

插入排序適用於已經有部分資料已經排好,並且排好的部分越大越好。一般在輸入規模大於1000的場合下不建議使用插入排序。