1. 程式人生 > >python 資料結構與演算法 day04 插入排序

python 資料結構與演算法 day04 插入排序

1. 插入排序

原理: 插入排序也是把序列分為有序序列和無序序列,首先把第一個元素(i=0位置)作為有序序列,比較i=1位置的第二個元素(其實也是待插入的元素)跟有序序列的元素進行比較(從後往前比較)如果比有序序列的元素小就進行交換,如果比有序序列的元素大,就不動,接著找無序序列的下一個待插入的元素,也是 跟有序序列中元素挨個從後往前比對,如果比有序序列的最後一個元素大,就停止 進行下一個帶插入元素比較,如果比有序序列最後一個元素小就進行交換,然後接著往前走,遇到比待插入元素大的就交換,直到遇到一個比待插入元素小的元素,那就是待插入元素在有序序列中的恰當位置,接著找下一個待插入元素進行類似比較~

注意:插入排序在把無序序列中的元素插入到有序序列中時,需要比較待插入的元素跟有序序列的元素,但是比較順序是從有序序列的尾部開始比較的,也就是首先把待插入的元素跟有序序列的最後一個元素進行比較,待插入元素更小就交換,接著往前走,待插入元素還更小就繼續交換,繼續往前走,直到遇到的原有序序列中某個元素比待插入元素還小,就不再進行移動了,待插入的元素就已經找到了自己的合適位置~

 

2. 程式碼實現

def insert_sort(L):
    """插入排序"""
    n=len(L)
    for i in range(1,n): # 首先外層迴圈執行遍歷1-n位置的元素,把後面序列中的元素依次放在前面有序序列的合適位置---複雜度n
for j in range(i,0,-1): # 內層迴圈是對需要插入的元素 和前面已經相對有序的序列進行比較,放在合適的位置(從後往前比較!!從前往後比較不對的) if L[j]<L[j-1]: L[j-1],L[j]=L[j],L[j-1] # 如果待插入的元素比有序序列中最後一個元素小就交換,然後繼續往前比較,直到遇到比前一個元素大,就停止break 進行下一個待插入元素比較, else: break return L print(insert_sort([4,2,7,1,9,3,8,0]))

 

執行結果:

 

 3. 時間複雜度

插入排序的時間複雜度也是O(n^2)

因為外層迴圈(把每一個元素都需要插入到前面有序序列的合適位置)需要n的複雜度,然後內層迴圈是對每一個待插入的元素需要和前面有序序列的每一個元素進行比較(最差的情況是需要從後往前比較到有序序列的第一個元素,當然最好情況是隻需要比較一次 也就是對應待插入的元素比有序序列的最後一個最大元素還要大,那就直接放在最後~)

 

 

4. 穩定性

插入排序是穩定的

 

5. 優化

上面的程式(有break)已經是優化之後的,也就是對應待插入的元素比有序序列的最後一個元素還要大時,直接停止該次待插入元素的比較,接著進行下一個待插入元素的相同過程比較;

因為前面的已經是有序序列,只要待插入的元素比有序序列的最後一個元素大,就不需要再執行比較操作了~