歸併排序(別名 分治排序)

2021-09-05 12:46:37 字數 990 閱讀 3363

歸併排序**展示:

'''歸併排序'''

n=len(alist)

#列表長度 n

if n<=1:

#如果長度小於等於1,直接返回列表

return alist

mid = n//2

#將列表折半,分成兩個列表

left_li = merge_sort(alist[:mid])

right_li = merge_sort(alist[mid:])

left_pointer,right_pointer = 0,0

#定義兩個列表的游標

result=

#new乙個新列表,對新列表進行追加

while left_pointer

#控制條件:左列表游標小於左列表長度,並且右列表游標小於右列表長度

if left_li[left_pointer]

#如果左列表游標指向的值小於右列表游標指向的值

#將左列表游標指向的值追加給新列表

left_pointer+=1

#左列表游標向後移動一位

else:

#如果右列表游標指向的值小於左列表游標指向的值

#將右列表游標指向的值追加給新列表

right_pointer+=1

#右列表游標向後移動一位

result += left_li[left_pointer:]

#如果迴圈結束,左列表還有沒對比的值,直接追加給新列表

result += right_li[right_pointer:]

#如果迴圈結束,右列表還有沒對比的值,直接追加給新列表

return result

#返回乙個排序完成的新列表

歸併排序(分治)

把乙個陣列 a 分成兩個部分 s,m m 1,e 假設兩部分分別有序,把這兩部分合併到另一陣列中 tmp 保證該陣列有序,然後再把資料 e s 1拷貝回陣列a 分治的原理。把資料無限二分,最後比較兩個數即可。遞迴實現。includeusing namespace std int a 10 int b...

歸併排序 分治

歸併 將已有序的子串行合併,得到完全有序的序列 即先使每個子串行有 序,再使子串行段間有序。若將兩個有序表合併成乙個有序表,稱為二路歸併。歸併的本質 空間換時間,通過申請乙個額外陣列儲存中間變化,從而實現排序 歸併排序核心步驟 歸併排序的特性總結 歸併的缺點在於需要o n 的空間複雜度,歸併排序的思...

分治 歸併排序

將兩個排序好的陣列歸併過程如下 紅色的 1 是左邊起始位置 綠色的 2 是右邊起始位置 灰色的 最右邊 是右邊終點位置 include using namespace std typedef int elementtype l 左邊起始位置,r 右邊起始位置,rightend 右邊終點位置 void...