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