【數據結構與算法Python實踐系列】經典排序算法-插入排序

插入排序

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

算法的原理如下:

插入排序的工作方式像許多人排序一手撲克牌。開始時,我們的左手爲空並且桌子上的牌面向下。然後,我們每次從桌子上拿走一張牌並將它插入左手中正確的位置。爲了找到一張牌的正確位置,我們從右到左將它與已在手中的每張牌進行比較。拿在左手上的牌總是排序好的,原來這些牌是桌子上牌堆中頂部的牌 。
插入排序是指在待排序的元素中,假設前面n-1(其中n>=2)個數已經是排好順序的,現將第n個數插到前面已經排好的序列中,然後找到合適自己的位置,使得插入第n個數的這個序列也是排好順序的。按照此法對所有元素進行插入,直到整個序列排爲有序的過程,稱爲插入排序。

  • 我們認爲列表的第一個元素是有序的,將後面的依次與前面的元素比較
  • 當目標元素小於前值時,當前值與前值進行位置交換
  • 目標重複上一過程,繼續與前值比較,直至大於等於前值或者已經處於列表首位
  • 重複以上過程完成排序操作
    在這裏插入圖片描述

時間複雜度

在插入排序中,當待排序數組是有序時,是最優的情況,只需當前數跟前一個數比較一下就可以了,這時一共需要比較N- 1次,時間複雜度爲 O(n)O(n)
最壞的情況是待排序數組是逆序的,此時需要比較次數最多,總次數記爲:1+2+3+…+N-1,所以,插入排序最壞情況下的時間複雜度爲O(n2)O(n^2)
平均來說,A[1…j-1]中的一半元素小於A[j],一半元素大於A[j]。插入排序在平均情況運行時間與最壞情況運行時間一樣,是輸入規模的二次函數 。

空間複雜度

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

穩定性分析

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

python實現

def insertion_sort(arr):
    for i in range(1, len(arr)):
        index = i
        data = arr[i]
        while index > 0 and arr[index - 1] > data:
            # 移動基礎 列表,確定要插入的位置
            arr[index] = arr[index - 1]
            index -= 1
        arr[index] = data
    return arr

if __name__ == "__main__":
    print(insertion_sort([45, 32, 8, 33, 12, 22, 19, 97]))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章