插入排序的基本方法:每步將待排序的元素,按其排序碼的大小插入到前面已經拍好的一組元素的適當位置上去,直到元素全部插入位置。
可以選擇不同的方法,在已經排好序的有序資料表在尋找插入位置,依據查詢方法的不同,有多種插入排序的方法。下面是常用的三種方法:1,直接排序;2,折半排序;3,希爾排序。
1,直接插入排序
定義:插入排序(insertion sort)演算法一般講資料分成兩組,分別是有序組和無序組,並將資料的第乙個元素預設為有序組,依次將無序組的元素依次按照降序或者是公升序的方式插入到有序組中。
圖例分析
python 原始碼:
def insertsort(a):
''' 這是乙個直接插入排序演算法'''
if not a or len(a)==1: # 如果輸入的列表為空或者程度為1,則返回自身
return a
# 第乙個元素預設為有序組,後面的(i+1)開始往後的元素都為無序組,並且依次與前面有序組的元素
# 進行比較排序
for j in range(1,len(a)):
i = j
while i > 0:
if a[i] < a[i-1]:
a[i],a[i-1] = a[i-1],a[i]
i -= 1
else:
break
return a
if __name__ == "__main__":
a = [6, 2, 4, 1, 3, 5, 2]
print(insertsort(a)) # 結果是:[1,2,2,3,4,5,6]
2,折半排序
定義:折半插入排序(binary insertion sort)是對插入排序演算法的一種改進,由於排序演算法過程中,就是不斷的依次將元素插入前面已排好序的序列中。由於前半部分為已排好序的數列,這樣我們不用按順序依次尋找插入點,可以採用折半查詢的方法來加快尋找插入點的速度。 在將乙個新元素插入已排好序的陣列的過程中,尋找插入點時,將待插入區域的首元素設定為a[low],末元素設定為a[high],則輪比較時將待插入元素與a[m],其中m=(low+high)/2相比較,如果比參考元素大,則選擇a[low]到a[m-1]為新的插入區域(即high=m-1),否則選擇a[m+1]到a[high]為新的插入區域(即low=m+1),如此直至low<=high不成立,即將此位置之後所有元素後移一位,並將新元素插入a[high+1]。
穩定性及複雜度
折半插入排序演算法是一種穩定的排序演算法,比直接插入演算法明顯減少了關鍵字之間比較的次數,因此速度比直接插入排序演算法快,但記錄移動的次數沒有變,所以折半插入排序演算法的時間複雜度仍然為o(n^2),與直接插入排序演算法相同。附加空間o(1)。
python**:
def bininsetsort(s):
''' 這是乙個折半排序演算法'''
for i in range(1,len(s)):
if s[i] < s[i-1]:
small = s[i]
low =0
high = i-1
while low <= high:
mid = (low+high)//2
if small < s[mid]:
high = mid - 1
else:
low = mid+1
for j in range(i-1,high-1,-1):
s[j+1] = s[j]
s[high+1] = small
s = [2,1,4,5,0,3,4,0]
bininsetsort(s)
print(s) # 結果為:[0, 0, 1, 2, 3, 4, 4, 5]
3,希爾插入排序
python原始碼:
def shellsort(a):
''' 這是乙個希爾排序'''
if not a or len(a)==1:
return a
grap = len(a)//2
while grap > 0:
for i in range(grap,len(a)): # 跟每乙個grap組的最後乙個元素
first = i
while first > 0: # 跟同乙個grap組之前的元素進行比較,當不存在時跳出迴圈
if a[first] < a[first-grap]:
a[first],a[first-grap] = a[first-grap],a[first]
first -= grap # 找到前乙個元素,繼續比較
else:
break
grap //= 2 # 縮小增量
return a
a=[3,2,4,1,7,5,0,8]
s = shellsort(a)
print(s) # 結果為: [0, 1, 2, 3, 4, 5, 7, 8]
排序演算法之插入排序
排序演算法之插入排序 1 插入排序的思想 假設在乙個有序序列中 e 0 e i 1 這i 個元素已經排好序,則當要將第 i 1個元素 e 插入該序列時,只需將第 i 1個元素與從 e 0 開始到e i 1 元素進行比較,當發現第 j個元素 e j 在序列中應在 e 前,且 e j 1 應在e 後時,...
排序演算法之插入排序
排序演算法之插入排序 1 插入排序的思想 假設在乙個有序序列中 e 0 e i 1 這i 個元素已經排好序,則當要將第 i 1個元素 e 插入該序列時,只需將第 i 1個元素與從 e 0 開始到e i 1 元素進行比較,當發現第 j個元素 e j 在序列中應在 e 前,且 e j 1 應在e 後時,...
排序演算法之插入排序
本節主要分析插入排序演算法的直接插入排序和希爾 shell 排序 又稱縮小增量排序 1.直接插入排序 該排序是最簡單的排序方法,其基本思想是 假設待排序的記錄存放在陣列r 1.n 中。初始時,r 1 自成1個有序區,無序區為r 2.n 從i 2起直至i n為止,依次將r i 插入當前的有序區r 1....