給定任意幾組資料,利用分治法的思想,將資料進行排序並將排好的資料進行輸出。
利用分治法,將乙個陣列元素大於 2 的陣列分成兩個子陣列,然後對每乙個子陣列遞迴呼叫,直到最下的子陣列的元素個數為 1,此時子陣列就不用進行排序了,再往上回溯,依據每個子陣列中的元素大小對子陣列進行合併,依次進行下去,最後返回的陣列就是乙個依據陣列元素大小排序好的陣列。
① 先解決小規模的問題,如陣列中只有 1 個元素的情況。
② 將問題分解,如果陣列的元素大於等於 2個,將陣列分為兩個小的陣列。
③ 遞迴的解各子問題,將中分解的兩個小的陣列再進行以上兩個步驟最後都化為小規模問題。
④ 將各子問題的解進行比較最終得到原問題的解。
上述**中,每次將每個陣列分成兩個子陣列,最後進行合併,因此我們可以得到遞迴式:import time
defmergesort
(a):
#遞迴直到子陣列元素個數少於1
iflen
(a)<=1:
return a
mid =
len(a)//2
result1 = mergesort(a[
:mid]
) result2 = mergesort(a[mid:])
return merge(result1, result2)
defmerge
(a, b)
:#依據子陣列元素大小合併子陣列
result =
i = j =
0while i <
len(a)
and j <
len(b)
:if a[i]
< b[j]:)
i +=
1else:)
j +=
1if i ==
len(a)
:while j <
len(b):)
j +=
1else
:while i <
len(a):)
i +=
1return result
defmain()
:from random import sample
rand_array = sample(
[x for x in
range(-
500,
500)],
10)print
(rand_array)
start = time.time(
) result = mergesort(rand_array)
(result)
end = time.time(
("共耗時:\n"
+str
(end - start)
+" s"
)if __name__ ==
'__main__'
: main(
)
t(n) = 2t(n/2) + n,依據主定理法得出該演算法的時間複雜度為 o(nlgn)
[
-482,-
435,
473,
-368,-
28,-50
,37,-
169,
488,
-388
]#排序前[-
482,
-435,-
388,
-368,-
169,-50
,-28,
37,473,
488]
#排序後
共耗時:
0.0 s
[188
,380,-
432,
119,
-230
,258,-
190,
156,
194,
-110
]#排序前[-
432,
-230,-
190,
-110
,119
,156
,188
,194
,258
,380
]#排序後
共耗時:
0.0 s
[178,-
171,
293,-90
,168,87
,375,-
11,270,
-331
]#排序前[-
331,
-171,-
90,-11
,87,168
,178
,270
,293
,375
]#排序後
共耗時:
0.0 s
分治法實現歸併排序
分治法實現歸併排序 include using namespace std define size 10 void merge int array,int first,int mid,int last 合併 if i mid for i mid i new arr k array i if j la...
分治法實現歸併排序
將乙個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。將待排序元素分成大小大致相同的兩個子集合,分別對兩個子集合進行排序,最終將排好序的子集合合併成要求的排好序的集合 void mergesort int a,int left,int right void mergeso...
分治法,歸併排序
1.時間複雜度為o nlog n 非降序 package com.cn.insertion 歸併排序,採用分治法的策略 author administrator public class merge sort mergesort a,0,9 for int i 0 i a.length i 先分在和...