直接插入排序

2021-08-31 11:51:10 字數 2638 閱讀 2211

插入排序:每一趟將乙個待排序的記錄,按照其關鍵字的大小插入到有序佇列的合適位置裡,直到全部插入完成。 

以上的過程,其實就是典型的直接插入排序,每次將乙個新資料插入到有序佇列中的合適位置裡。

很簡單吧,接下來,我們要將這個演算法轉化為程式語言。

假設有一組無序序列 r0, r1, ... , rn-1。

(1) 我們先將這個序列中下標為 0 的元素視為元素個數為 1 的有序序列。

(2) 然後,我們要依次把 r1, r2, ... , rn-1 插入到這個有序序列中。所以,我們需要乙個外部迴圈,從下標 1 掃瞄到 n-1 。

(3) 接下來描述插入過程。假設這是要將 ri 插入到前面有序的序列中。由前面所述,我們可知,插入ri時,前 i-1 個數肯定已經是有序了。

所以我們需要將ri 和r0 ~ ri-1 進行比較,確定要插入的合適位置。這就需要乙個內部迴圈,我們一般是從後往前比較,即從下標 i-1 開始向 0 進行掃瞄。

# -*- coding:utf-8 -*-

def insertsort(input_list):

if len(input_list) == 0:

return

sorted_list = input_list

'''得從第二個數開始算'''

for i in range(1, len(sorted_list)):

'''記錄當前值'''

temp = sorted_list[i]

j = i - 1

'''如果當前值比它前面的數小,要把他插入到應該插入的位置'''

while j >=0 and temp < sorted_list[j]:

sorted_list[j + 1] = sorted_list[j]

j -= 1

'''直接將臨時變數賦值給他應在的位置'''

sorted_list[j + 1] = temp

return sorted_list

if __name__ == '__main__':

input_list = [6, 4, 8, 9, 2, 3, 1]

print('排序前:', input_list)

sorted_list = insertsort(input_list)

print('排序後:', sorted_list)

因為在乙個有序序列中查詢乙個插入位置,以保證有序序列的順序不變,所以可以使用二分查詢,減少元素比較次數提高效率。二分查詢是對於有序陣列而言的,假設如果陣列是公升序的,那麼二分查詢演算法就是不斷對陣列進行對半分割,每次拿中間元素和目標數字進行比較,如果中間元素小於目標數字,則說明目標數字應該在右側被分割的陣列中,如果中間元素大於目標數字,則說明目標數字應該在左側被分割的陣列中。

# -*- coding:utf-8 -*-

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

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]

'''經過二分查詢得出temp應在的序列值'''

insert_index = binarysearch(result, i, result[i])

'''判斷到底用不用交換'''

if insert_index != -1:

'''交換index之後的位置,都往後挪一位'''

while j >= insert_index:

result[j + 1] = result[j]

j -= 1

result[j + 1] = temp

return result

if __name__ == '__main__':

input_list = [6, 4, 8, 9, 2, 3, 1]

print('排序前:', input_list)

sorted_list = binaryinsertsort(input_list)

print('排序後:', sorted_list)

直接插入排序

直接插入排序是一種最簡單的排序方法,它的基本思想是依次將每個記錄插入到乙個有序中去。就是說,第i i 1 遍整理時,a1,a2,ai 1已經是排好序的子串行 取出第i個元素ai,在已排好序的子串行為ai找到乙個合適的位置,並將它插到該位置上。易知上述排序當i 1時實際上為空操作,故可直接從i 2開始...

直接插入排序

直接插入排序的演算法思想 直接插入排序 straight insertion sort 的基本操作是將乙個記錄插入到已經排好序的有序表中,從而得到乙個新的 記錄數增 1 的有序表。根據該思想,編寫 如下 從已有序列的第0個記錄開始比較 public static void insertsort1 i...

直接插入排序

源文章url http student.zjzk.cn course ware data structure web paixu paixu8.2.1.1.htm 做過部分修改。1 基本思想 假設待排序的記錄存放在陣列r 1.n 中。初始時,r 1 自成1個有序區,無序區為r 2.n 從i 2起直至...