python學習 插入排序的乙個小小優化

2021-08-17 11:16:01 字數 1528 閱讀 7870

插入排序核心:通過構建有序序列,對於未排序序列,在已排序序列中從後向前掃瞄(對於單向鍊錶則只能從前往後遍歷),找到相應位置並插入。實現上通常使用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...