C语言,谁都能看得懂的归并排序
喜歡看排序算法動態(tài)效果的,可以看看這個網(wǎng)站
https://visualgo.net/zh/sorting
里面很多算法的動畫解釋,可以看到算法的排序效果,而且還附帶了偽代碼的實現(xiàn)過程。
本來想錄制幾張動圖放上來,但是因為圖片較大,傳不上來,公眾號對動態(tài)圖片有限制,喜歡的同學可以點擊我上面的鏈接,自己去嘗試一下。
我畫了一個圖片,用來表示歸并排序的運算過程
排序的過程
先把需要排序的數(shù)據(jù)分成兩份。
把兩份的數(shù)據(jù)依次進行排序并組合在一起。
再把排序后的兩組數(shù)據(jù)進行并入一起排序。
好了,寫代碼吧
我們先實現(xiàn),「把兩份的數(shù)據(jù)依次進行排序并組合在一起」
下面是實現(xiàn)這個的算法過程
如果我們對兩個數(shù)進行排序
經(jīng)過上面的那個函數(shù)排序后,我們會把[3,1]排序成[1,3]。
——
那,如果我們需要對4個數(shù)字進行排序呢?
我們需要先把4個數(shù)字分成2組
然后,我們需要依次對上面的兩組數(shù)據(jù)進行排序,得到下面新的兩組數(shù)據(jù)
然后,我們需要把已經(jīng)排序的兩個數(shù)組進行排序
s[]?是保存的排序結(jié)果,r[] 是需要排序的數(shù)組。
left,mid,right 是排序數(shù)組中的三個位置。
left = 0;
right = 3;
mid = ( left + right )/2 =?1;
進入函數(shù)體,我們需要三個變量來協(xié)助我們進行運算
i = left = 0;
j = mid +1 =?1 +1 = 2;
k = left = 0;
它們看起來是這樣子的
把r[i]?和 r[j]?兩個數(shù)進行比較,把小的那個數(shù)放到s[k] 里面,然后再移位
比較之后變成
然后再執(zhí)行下面的代碼
這時候 j = 4
這時候就退出了 for 循環(huán)
退出for 循環(huán)后 就開始執(zhí)行下面的 for 循環(huán)
這樣后,會變成這樣
這樣就退出 merge 函數(shù)
經(jīng)過上面的過程,我們需要應(yīng)該有點悟性,我們需要使用遞歸來解決這些問題
可以看下面的文章了解啥是遞歸
C 語言,你真的懂遞歸了嗎?
然后呢,我們就寫了一個這樣的遞歸函數(shù),放心吧,在學習樹的時候,也是需要這種遞歸操作的。
這個函數(shù)就是遞歸函數(shù),遞歸最后退出機制是?
left?==?right?
再然后,我們需要一個?main 函數(shù)
完整的代碼實現(xiàn)如下
程序輸出
算法復(fù)雜度,翻開以前寫的文章
時間復(fù)雜度和空間復(fù)雜度,一看就懂,面試前必過一遍
中間是?mid =?(left+right)/2?
可以猜到是 O(logN) ,也就是排序的時間是用logN時間去拆分的,而且拆分的時候,我們還需要進行排序,也就是代碼里面提到的,排序的時間是O(n),所以在拆分和排序中需要花費的時間是 O(NlogN)。
拆分需要花費 O(logN) ,那合并的時候自然也需要花費O(logN)
總的算法時間是
O(NlogN + logN)??=?O(NlogN)
推薦閱讀:
專輯|Linux文章匯總
專輯|程序人生
專輯|C語言
我的知識小密圈
關(guān)注公眾號,后臺回復(fù)「1024」獲取學習資料網(wǎng)盤鏈接。
歡迎點贊,關(guān)注,轉(zhuǎn)發(fā),在看,您的每一次鼓勵,我都將銘記于心~
總結(jié)
以上是生活随笔為你收集整理的C语言,谁都能看得懂的归并排序的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2022年7月深圳地区CPDA数据分析师
- 下一篇: 2年质保期刚过就翘辫子,这是什么骚设计?