c語言手撕 歸併排序 複雜度NlogN演算法

2021-10-23 21:00:51 字數 1365 閱讀 7928

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