插入排序:每一趟將乙個待排序的記錄,按照其關鍵字的大小插入到有序佇列的合適位置裡,直到全部插入完成。
以上的過程,其實就是典型的直接插入排序,每次將乙個新資料插入到有序佇列中的合適位置裡。
很簡單吧,接下來,我們要將這個演算法轉化為程式語言。
假設有一組無序序列 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起直至...