排序演算法之python直接插入排序

2021-08-25 14:21:55 字數 3761 閱讀 1858

直接插入排序是一種最簡單的插入排序。有降序和公升序兩種。

序列分為兩個部分,前半部分是有序序列,後半部分是無序序列,每次從無序序列裡取乙個放在有序序列的合適位置。直到無序序列為空。

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...