Python 歸併排序 分治

2021-10-07 10:18:04 字數 2428 閱讀 7780

import random,time

start = time.time(

)def

merge1

(data,left,mid,right,):

#從小到大排

''' 傳入兩部分資料,然後整合到一起

:param data: 需要排序的資料

:param left: 需要整合資料最左邊

:param mid: 需要整合資料中間

:param right: 需要整合資料最右邊

'''temp =

#定義空陣列,暫存排序好的資料

i = left #第一部分資料下標開始位置

j = mid+

1#第二部分資料下標開始位置

# 當兩部分資料有一部分被遍歷完後退出

while i<=mid and j<=right:

# 比較兩部分資料,從小到大依次放入到臨時陣列temp

if data[i]

< data[j]:)

i+=1else:)

j+=1#退出迴圈時,把兩部分資料有完全遍歷的資料依次追加到temp完成排序

while i<=mid:

) i +=

1while j<=right:

) j +=

1# 將整理好的資料更新到原始資料中

# 元素資料更新的範圍為data[left,right],逐一遍歷更新

index = left

for i in

range

(len

(temp)):

data[index]

=temp[i]

index+=

1def

merge2

(data, left, mid, right,):

# 從大到小排

''' 傳入兩部分資料,然後整合到一起

:param data: 需要排序的資料

:param left: 需要整合資料最左邊

:param mid: 需要整合資料中間

:param right: 需要整合資料最右邊

'''temp =

# 定義空陣列,暫存排序好的資料

i = left # 第一部分資料下標開始位置

j = mid +

1# 第二部分資料下標開始位置

# 當兩部分資料有一部分被遍歷完後退出

while i <= mid and j <= right:

# 比較兩部分資料,從大到小依次放入到臨時陣列temp

if data[i]

> data[j]:)

i +=

1else:)

j +=

1# 退出迴圈時,把兩部分資料有完全遍歷的資料依次追加到temp完成排序

while i <= mid:

) i +=

1while j <= right:

) j +=

1# 將整理好的資料更新到原始資料中

# 元素資料更新的範圍為data[left,right],逐一遍歷更新

index = left

for i in

range

(len

(temp)):

data[index]

= temp[i]

index +=

1def

mergesort

(data,left,right,reverse =

false):

if left < right:

mid =

(left+right)//2

mergesort(data,left,mid,reverse)

mergesort(data, mid+

1, right,reverse)

ifnot reverse:

merge1(data,left,mid,right)

else

: merge2(data, left, mid, right)

return data

if __name__ ==

'__main__'

:# data = [8,9,1,7,2,3,9,1,5,4,6,0]

data =

[random.randint(1,

10000

)for i in

range

(10000)]

ret = mergesort(data,0,

len(data)-1

)# print(ret)

end = time.time(

)print

(end-start)

input

()

歸併排序(分治)

把乙個陣列 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...