#include
#include
void
printarr
(int arr,
int l,
int r)
printf
("\n");
}void
merge
(int arr,
int l1,
int r1,
int l2,
int r2)
else
}while
(i < r1)
while
(j < r2)
i =0;
for(
;i < k; i++)}
intmin
(int a,
int b)
intmain()
;printf
("original array:\n");
int l =
0, r =
7, step =2;
printarr
(arr, l, r)
;while
(step < r*2)
printf
("\nstep length of merging: %d\n"
, step/2)
;printarr
(arr, l, r)
; step *=2
;}printf
("\n finale sorted array:\n");
printarr
(arr,l,r)
;return0;
}
1過程:以乙個長度為7的整數陣列為例展示歸併排序的過程,這裡直接用了切斷,而非遞迴方法。對陣列先2個2個切,比較大小; 再每4個切開,將上述排序好的2個原子組合並;再每8個切開,上述排序好的4個原子組合並。。。 終結條件就是2^n > n陣列長度那一切,全部排序完畢。
由於邊界未必剛好是2^n 次方,故截至邊界定位min(n,2^n)。
2說明,顯然可見總共迭代了logn輪(排序步長step依次為2、4、8 到8就覆蓋了全組了)。每輪都會遍歷一遍所有陣列元素(至少都移動了,比較的元素未必多。這是有人認為最小複雜度小於nlogn的原因,但是有點耍流氓)。所以可以認為,平均、最小、最大複雜度都是o(nlogn)
作為非計算機專業的,第一次手寫乙個nlogn複雜度的排序程式。還是c語言這種硬編碼方式,既有些得意,也有些滄然(預留了1個小時,沒想到半個小時搞定了)。確實感到計算機、程式設計、演算法難度的時候,又顯然摸到了一點竅門。
那些動態規劃類複雜演算法、那些模板反射等機制、那些設計模式也不是那麼可怕的,只是不知道門徑罷了。
歸併排序時間複雜度分析
主要參考了他的博文,他還講解了其他排序的時間複雜度分析及演算法實現。可以說合併排序是比較複雜的排序,特別是對於不了解分治法基本思想的同學來說可能難以理解。總時間 分解時間 解決問題時間 合併時間。分解時間就是把乙個待排序序列分解成兩序列,時間為一常數,時間複雜度o 1 解決問題時間是兩個遞迴式,把乙...
歸併排序演算法的時間複雜度
來自教程 我們對n個元素進行歸併排序,需要時間t n 那分解成兩個子陣列排序的時間都是t n 2 merge 函式合併的時間複雜度是o n 歸併排序的時間複雜度計算公式是 t 1 c n 1 時,只需要常量級的執行時間,所以表示為 c。t n 2 t n 2 n n 1 如何求t n 我們對t n ...
歸併排序時間複雜度分析
歸併 public void static main int leftarray newint num 2 public void static sort int begin,int end,int array,int leftarray public void static merge int b...