插入排序(binary 遞迴法)

2021-10-13 15:33:32 字數 1601 閱讀 8794

因為插入演算法實質是與有序的陣列依次比較,所以乙個數與有序陣列比較並排序的做法可以用二分法來做到。

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