插入排序(insertion sort)的基本思想是:將列表分為2部分,左邊為排序好的部分,右邊為未排序的部分,迴圈整個列表,每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子串行中的適當位置,直到全部記錄插入完成為止。
插入排序非常類似於整撲克牌。
在開始摸牌時,左手是空的,牌面朝下放在桌上。接著,一次從桌上摸起一張牌,並將它插入到左手一把牌中的正確位置上。為了找到這張牌的正確位置,要將它與手中已有的牌從右到左地進行比較。無論什麼時候,左手中的牌都是排好序的。
也許你沒有意識到,但其實你的思考過程是這樣的:現在抓到一張7,把它和手裡的牌從右到左依次比較,7比10小,應該再往左插,7比5大,好,就插這裡。為什麼比較了10和5就可以確定7的位置?為什麼不用再比較左邊的4和2呢?因為這裡有乙個重要的前提:手裡的牌已經是排好序的。現在我插了7之後,手裡的牌仍然是排好序的,下次再抓到的牌還可以用這個方法插入。程式設計對乙個陣列進行插入排序也是同樣道理,但和插入撲克牌有一點不同,不可能在兩個相鄰的儲存單元之間再插入乙個單元,因此要將插入點之後的資料依次往後移動乙個單元。
definsertion_sort(array):
for i in range(1,len(array)):
position =i#大迴圈走到了第i+1個元素(預設從第2個元素開始)
current_val =array[position]
while position > 0 and current_val < array[position-1]:直到出現position為0或者當前位置左邊的元素小於當前位置元素才跳出迴圈
array[position] = array[position-1]#如果左邊的元素大於當前位置的元素,就把左邊的值給當前位置
position -=1
else
: array[position] =current_val
array = [45,12,4,53,198,9,65]
insertion_sort(array)
(array)
#[4, 9, 12, 45, 53, 65, 198]
簡單容易理解的版本:
data_set = [45,12,4,53,198,9,65]for i in
range(len(data_set)):#從第二個數開始,依次對前2個,3個。。。進行排序,相當於每次把第i+1個數插進去,和前面已經排序好的數作比較while i > 0 and data_set[i] < data_set[i-1]:
data_set[i],data_set[i-1] = data_set[i-1],data_set[i]
i -= 1
(data_set)
#[4, 9, 12, 45, 53, 65, 198]
如果碰見乙個和插入元素相等的,那麼插入元素把想插入的元素放在相等元素的後面。所以,相等元素的前後順序沒有改變,從原無序序列出去的順序就是排好序後的順序,所以插入排序是穩定的。
直接插入排序複雜度:
時間複雜度: 最好情況o(n), 最壞情況o(n^2), 平均情況o(n^2)
空間複雜度: o(1)
穩定性: 穩定
演算法基礎之排序 插入排序
排序演算法是演算法基礎中最常見也是最應該掌握的演算法。插入排序的想法,和我們玩撲克牌起牌相似。從左手為空開始,撲克牌背面朝上至於桌上,每次從桌面上摸一張牌,並將其插入到左手正確的位置,使得左手中的牌是有序的。為了找到這張牌的正確插入位置,從右到左逐一比較左手中的牌。當摸完桌上的牌時,左手中的牌就是排...
演算法基礎 排序演算法 插入排序
插入排序也是非常容易理解的排序演算法,這篇文章介紹一下排序的主要要點和實現,插入排序的主要做法是外層迴圈中選定插入元素,內層迴圈移動並空出插入位置,返回外層迴圈進行插入。選擇排序的主要要點如下所示 n個元素,陣列元素從0開始計數 void insert sort int arr,int num 加上...
演算法 排序演算法之插入排序
插入排序的 實現雖然沒有氣泡排序和選擇排序那麼簡單粗暴,但它的原理應該是最容易理解的了,因為只要打過撲克牌的人都應該能夠秒懂。插入排序是一種最簡單直觀的排序演算法,它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序和氣泡排序一樣,也有一種優化演算...