因為插入演算法實質是與有序的陣列依次比較,所以乙個數與有序陣列比較並排序的做法可以用二分法來做到。
def insert_binary_sort(x):
result = [x[0]]
for i in range(1, len(x)):
result = my_method(result, x[i])
return result
def my_method(result, value):
point = len(result) // 2
if point == 0:
if value < result[0]:
return [value, result[0]]
return [result[0], value]
if result[point-1] <= value <= result[point]:
return result[:point] + [value] + result[point:]
if value < result[point-1]:
return my_method(result[:point], value) + result[point:]
return result[:point] + my_method(result[point:], value)
if __name__ == '__main__':
test_list = [i for i in range(20, 0, -1)]
print(insert_binary_sort(test_list))
**說明:
前面5次省略,第6次時,list[6]與前面已經排好順序的陣列比較並排序,因為陣列三有序,可以有二分法來進行比較並排序list[6]這個元素。
設:
已經排好序的陣列為變數 result
value = list[6]
用 point = len(result) // 2 得到切點.
把result分成result[:point]和result[point:]兩份.
比較value與 切口(result[point-1]和result[point])的大小關係.
如果 result[point-1] <= value <= result[point],就把它們(result[:point] + [value] + result[point:])合併返回.
如果value < result[point-1](左切口),則把result[:point]作為新的有序陣列new_result,再用二分法切new_result, 得到新的切口,value再與之比較, 遞迴.
如果value > result[point](右切口),則把result[point:]作為新的有序陣列new_result,再用二分法切new_result, 得到新的切口,value再與之比較, 遞迴.
遞迴出口:當point == 0時,代表new_result長度為1,只有乙個元素,value與之比較,返回乙個有序陣列[value, new_result[0]]或[new_result[0], value],前者value小,後者value大.
遞迴法排序
include stdio.h define max 100 void qsort int v,int left,int right main void qsort int v,int left,int right void swap int v,int i,int j 主程式為測試程式,程式的核心...
陣列排序 3 遞迴插入排序
目錄 演算法思想 實現 時間複雜度 先將最後乙個元素插入前 n 1 個元素組成的有序陣列arr1中,整個陣列便排好序了。但是在此之前要將陣列arr1排好序 將倒數第二個元素插入前 n 2 個元素組成的有序陣列arr2中,陣列arr1便排好序了。但是在此之前要將陣列arr2排好序 將倒數第三個元素插入...
遞迴形式改寫插入排序
2020.2.7 13 30 思路 從第乙個值開始,向前面的插入,後面的數字在向前面插入的時 候,前面的數字一定已經排好序了,找乙個位置將這個數再放入到正確 的位置。演示 public static void main string args system.out.println 排序之前 for ...