一、插入排序:每一趟將一個待排序的元素,按其關鍵字的大小插入到已排序序列的適當位置,直到全部插入完成。
常見的插入排序有以下三種。
1、直接插入排序
1)過程:直接插入排序是一種最簡單的排序方法,其過程就是依次將每個元素插入到一個有序的序列中去。不過它有個缺點,就是當我們的數據基本有序時,每次插入都要移動位置,此時的插入效率是很低的。爲了解決這種情況,又產生了拆半插入排序,希爾排序。
工作原理:插入排序在實現上,從後面向前掃描(一開始從下標爲1的元素開始,往下標爲0的元素遍歷),在掃描過程中,需要反覆把已排序元素逐步向後挪位,爲最新的元素提供插入位置。
直接插入排序示意圖
2)python實現:
def sort3(a):
for i in range(1,len(a)):
for j in range(i,0,-1):
if a[j-1] > a[j]:
a[j],a[j-1] = a[j-1],a[j]
return a
3)複雜度
空間複雜度:O(1)
時間複雜度:
平均 O( )
最好 O(n) :初始數據序列正序時
最壞 O( ) :初始數據序列反序時
2、拆半插入排序
1)過程:對直接插入排序尋找合適插入點時,用了類似二分法的尋位方法
2)python實現:
#折半插入排序=直接插入排序+二分查找
def sort4(a):
for i in range(1,len(a)):
tmp = a[i]
low = 0
high = i-1
#查找位置
while low <= high:
mid = (low + high) // 2
if tmp > a[mid]:
low = mid +1
else:
high = mid -1
#插入元素
for j in range(i,low,-1):
a[j] = a[j-1]
a[low] = tmp
return a
3)複雜度
空間複雜度:O(1)
時間複雜度:
平均 O( )
相比直接插入排序減少了關鍵字的比較次數,但元素的移動次數不變。
3、希爾排序
1)過程:希爾排序又稱縮小增量排序,基本思想:把元素按下標的一定增量d分組,對每組元素採用直接插入排序的方法進行排序,然後隨着增量不斷減小,直到d爲1,整個數據合爲一組有序序列。
希爾排序示意圖
2)python實現:
def sort5(a):
step = len(a) // 2
while step > 0:
for i in range(step,len(a)):
for j in range(i,0,-step):
if a[j] < a[j-step]:
a[j],a[j-step] = a[j-step],a[j]
step //= 2
return a
3)複雜度
空間複雜度:O(1)
時間複雜度:
平均 O( )
最好 O(n)
最壞 O( )