插入排序核心:通過構建有序序列,對於未排序序列,在已排序序列中從後向前掃瞄(對於單向鍊錶則只能從前往後遍歷),找到相應位置並插入。實現上通常使用in-place排序(需用到o(1)的額外空間)
從第乙個元素開始,該元素可認為已排序
取下乙個元素,對已排序陣列從後往前掃瞄
若從排序陣列中取出的元素大於新元素,則移至下一位置
重複步驟3,直至找到已排序元素小於或等於新元素的位置
插入新元素至該位置
重複2~5
按照以上分析,我們用python語言可以寫出插入排序的**:
def
insertsort
(li):
#插入排序,核心思想是對每乙個元素按照從後向前的順序依次比較大小
n = len(li)
if n <= 1:
return li
else:
for i in range(1, n):
value = li[i]
index = i
while li[index-1] > value and index > 0:
li[index] = li[index - 1]
index -= 1
li[index] = value
return li
在作者電腦上通過對長度為20000的列表進行排序,計算時長為49s。
簡單的優化:
通過對插入演算法的分析,我們發現,在每次對已知元素與前面的元素進行比較大小時,如果小於前面的,我們就將兩者調換位置。這很類似在圖書館放置圖書的過程,我們在將借閱的圖書放置回原來位置時,是直接鎖定該位置,然後將該位置一側的圖書全部移動一部分,最後再將該圖書直接插入到該位置上,而不是一本一本的移動。
從這個思想出發,我們可以對插入演算法進行適當優化:在while迴圈中的比較我們並不做元素的交換,只用來記錄索引的位置。當確定該元素需要插入的位置後,我們直接將該元素插入到指定位置即可,這樣可以省下很多次元素的交換。
通過以上分析,我們可以對源**進行修改:
def
insertsort
(li):
#插入排序,核心思想是對每乙個元素按照從後向前的順序依次比較大小
n = len(li)
if n <= 1:
return li
else:
for i in range(1, n):
value = li[i]
index = i
while li[index-1] > value and index > 0:
index -= 1
res = li.pop(i)
li.insert(index, res)
return li
這裡我們通過list.pop()方法移除目標元素,通過list.insert()方法將目標元素插入到指定位置。
同樣對長度為20000的列表進行排序,計算時長為29s,節省了40%的時長。
python 插入排序
coding utf 8 def insertsort list list 4,1,9,13,34,26,10,7,4 m len list 元素個數 for i in range m 對每乙個元素 min i 當前元素索引 for j in range i 1,m 遍歷後面的所有元素,尋找最小的值...
Python 插入排序
本博文示例為自己指定一定範圍,生成指定個數的隨機數,再對生成的隨機數進行排序,並記錄排序所花時間。生成指定範圍 指定個數隨機數 import random def generate point range gene size,min val,max val num list i 0 while i ...
Python 插入排序
把第乙個數固定,然後將其它數插入,小的放前面。備份這個後續插入的數,然後將這個數和前面的數作比較,比前面的數小,就將前面的數後移。這樣相當於前面的數就挪出乙個空,如果再往前沒有比它小的了,就把開始備份好的數填進去。插入排序,穩定,平均和複雜都是o n2 o n 2 def insert sort l...