直接插入排序是一種最簡單的插入排序。有降序和公升序兩種。
序列分為兩個部分,前半部分是有序序列,後半部分是無序序列,每次從無序序列裡取乙個放在有序序列的合適位置。直到無序序列為空。
def insertsort(input_list):
if len(input_list) == 0:
return
sorted_list = input_list
for i in range(1,len(input_list)):
#將待排元素賦給臨時變數
temp = sorted_list[i]
#從待排元素前乙個元素開始尋找temp的合適位置
j = i-1
#沒有找到合適位置就讓將空出的位置向前移動
while j>= 0 and temp < sorted_list[j]:
sorted_list[j+1] = sorted_list[j]
j -=1
#找到合適位置將temp放在該位置
#因為迴圈裡是先移動再讓j減一了,故合適位置應該在j+1的位置
當資料正序時,執行效率最好,每次插入都不用移動前面的元素,時間複雜度為o(n)。
當資料反序時,執行效率最差,每次插入都要前面的元素後移,時間複雜度為o(n^2)。
所以,資料越接近正序,直接插入排序的演算法效能越好。
需要乙個臨時變數temp,故為1
在sorted_list[j+1]=temp是在不小於的情況下,故相等時是不交換的,所以直接插入排序是一種穩定排序演算法
因為在尋找temp的合適插入位置時用的是從後往前查詢,我們可以用二分查詢減少因此產生的元素交換次數
二分查詢每次從序列的中間查詢該元素是否等於插入元素,若插入元素比中間元素小,則繼續在中間元素的左邊繼續二分查詢;
若插入元素比中間元素大,則繼續在中間元素的右邊繼續二分查詢。
**:
def binaryinsertsort(input_list):
if len(input_list) == 0:
return
result = input_list
for i in range(1, len(input_list)):
j = i - 1
temp = result[i]
#二分查詢合適位置的索引
insert_index = binarysearch(result, i, result[i])
if insert_index != -1:
#找到後將該位置及以後的元素向後移動
while j >= insert_index:
result[j + 1] = result[j]
j -= 1
#將temp放入合適位置
result[j + 1] = temp
print("%dth"%i)
print(result)
return result
#二分查詢
def binarysearch(input_list,end,value):
left = 0
right = end-1
while left <= right:
middle = left + (right-left)//2
if input_list[middle] >= value:
right = middle-1
else:
left = middle+1
return left if left < end else -1
if __name__ == '__main__':
input_list = [50,123,543,187,49,30,0,2,11,100]
print("input_list:")
print(input_list)
sorted_list = binaryinsertsort(input_list)
print("sorted_list:")
print(sorted_list)
結果:不變,只是內部查詢合適位置的次數減少了,由o(n)變成了o(lgn),提高了效率
input_list:
[50, 123, 543, 187, 49, 30, 0, 2, 11, 100]
1th:
[50, 123, 187, 49, 30, 0, 2, 11, 100, 543]
2th:
[50, 123, 49, 30, 0, 2, 11, 100, 187, 543]
3th:
[50, 49, 30, 0, 2, 11, 100, 123, 187, 543]
4th:
[49, 30, 0, 2, 11, 50, 100, 123, 187, 543]
5th:
[30, 0, 2, 11, 49, 50, 100, 123, 187, 543]
6th:
[0, 2, 11, 30, 49, 50, 100, 123, 187, 543]
7th:
[0, 2, 11, 30, 49, 50, 100, 123, 187, 543]
sorted_list:
[0, 2, 11, 30, 49, 50, 100, 123, 187, 543]
排序演算法 直接插入
直接插入排序基本思想 假設待排序的記錄存放在陣列r 1.n 中。初始時,r 1 自成1個有序區,無序區為r 2.n 從i 2起直至i n為止,依次將r i 插入當前的有序區r 1.i 1 中,生成含n個記錄的有序區。通過下面乙個排序的例子,來幫助我們理解直接插入排序的思想。我們假設下面無序的序列開頭...
排序演算法 直接插入
簡介 插入排序 insertion sort 是一種簡單直觀且穩定的排序演算法。基本思想是 每一趟將乙個待排序的記錄,按其關鍵字的大小插入到已經排好序的一組記錄的適當位置上,直到所有待排序記錄全部插入為止。圖示 類似玩撲克牌遊戲時,按序排列紙牌。示例 include using namespace ...
演算法之直接插入排序
演算法之直接插入排序簡介 直接插入排序 基本操作是將一條記錄插入到已排好的有序表中,從而得到乙個新的 記錄數量增1的有序表。參考 直接插入排序 基本操作是將一條記錄插入到已排好的有序表中,從而得到乙個新的 記錄數量增1的有序表。author zhang public class directinse...