欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

設(shè)計(jì)C語言算法時,怎樣才算合格?感覺算法好難,基于數(shù)組的歸并排序算法該如何理解?

黃文隆2年前14瀏覽0評論

謝邀。

我的上個回答簡要討論了下什么是算法,并且介紹了C語言程序開發(fā)中比較基本的數(shù)組排序算法——插入排序法,如果題主看了,應(yīng)該有助于理解本題。

事實(shí)上,讓C語言編程具有魅力的是算法,拿到問題,能夠設(shè)計(jì)出解決方案并且完成代碼的是程序員,只會按照步驟編碼的是碼農(nóng)。

這是上個回答的主題,有朋友看到也有感而發(fā):在評論區(qū)說,“程序是骨架,算法才是靈魂”。的確,C語言程序只是指令,計(jì)算機(jī)只會冷冰冰的按照指令辦事,它并不能解決問題,真正解決問題的還是人。

什么樣的算法才是好的算法呢?

假設(shè)計(jì)算機(jī)是無限快的,并且存儲器是免費(fèi)的無限大的,那最好的算法就是最容易實(shí)現(xiàn)的算法。

然而,計(jì)算機(jī)也許是快的,但它們不是無限快。存儲器也許是廉價(jià)的,但不是免費(fèi)的。所以計(jì)算時間是一種有限資源,存儲器的空間也一樣。優(yōu)秀的程序員應(yīng)該盡力設(shè)計(jì)出開銷更小的算法

下面再討論下C語言程序開發(fā)中,數(shù)組的歸并排序算法,這種算法也是比較經(jīng)典的排序法,在數(shù)組元素非常多的情況下,效率遠(yuǎn)遠(yuǎn)高于插入排序法。

什么是歸并排序呢?

歸并排序的定義,希望了解“一本正經(jīng)”的官方書面定義可以自行百科。這里就不寫了,因?yàn)椤袄浔摹睍娑x對不了解它的人來說太難懂。

我打算用一些容易理解的例子來解釋它。

假設(shè)有一個C語言數(shù)組需要排序,那數(shù)組長度為多長最簡單呢?顯然是長度為1時,排序最簡單,什么都不需要做,就能夠排好序。

歸并排序的基本思路就是這樣:把長數(shù)組一直拆分下去,直到最后不能拆分為止,這時長數(shù)組被拆分為若干個長度為1的數(shù)組,長度為1的數(shù)組顯然是排好序的了。

例如下圖是一個長度為5的數(shù)組,為了排序,先把它拆分到不能繼續(xù)拆為止。

接著,只要把這些排好序的子數(shù)組按照從小到大的順序合并,就可以得到最終排好序的數(shù)組了。

好了,現(xiàn)在知道歸并排序的算法了,那怎樣使用C語言編程完成這個算法呢?

使用C語言編程實(shí)現(xiàn)歸并排序算法

歸并排序算法總體可以分為兩步:拆分?jǐn)?shù)組,合并數(shù)組。先來看看怎樣使用C語言實(shí)現(xiàn)數(shù)組的拆分。

使用C語言拆分?jǐn)?shù)組

對數(shù)組拆分有多種方法,這里選擇平分法。

如果使用start表示數(shù)組頭,end表示數(shù)組尾,每次平均拆分,都會將數(shù)組分為start到mid,和mid+1到end兩部分,其中mid表示中間點(diǎn),所以mid=(start+end)/2。就這樣一直拆分下去,直到不能繼續(xù)拆分為止。

不能拆分時,start應(yīng)該不再小于end。

拆分?jǐn)?shù)組的數(shù)學(xué)描述完畢了,容易看出,遞歸(如果題主對C語言的遞歸不理解,可以查看我之前的問答或者文章。)非常適合解決這樣的問題。我們現(xiàn)在用C語言來實(shí)現(xiàn)這樣的拆分,先確定遞歸的基礎(chǔ)條件:

拆分過程會在start不再小于end時停下。其他情況時,拆分會繼續(xù)下去,相關(guān)C語言代碼如下,請看:

divide(start,mid);負(fù)責(zé)拆分前半段,divide(mid+1,end);負(fù)責(zé)拆分后半段。這樣的divide函數(shù)可以把數(shù)組拆分到不可拆分為止。

使用C語言合并數(shù)組

使用divide函數(shù)把數(shù)組拆分完畢后,就可以按照從小到大的順序把各個元素合并到原來的數(shù)組了。

由于兩個子序列都已經(jīng)排好序了,所以merge()函數(shù)的C語言代碼很簡單,每次循環(huán)取兩個子序列中最小的元素進(jìn)行比較,將較小的元素取出放到最終的排序序列中,如果其中一個子序列的元素已取完,就把另一個子序列剩下的元素都放到最終的排序序列中。

使用C語言實(shí)現(xiàn)數(shù)組的歸并排序

數(shù)組的拆分和合并函數(shù)都寫好了,可以把它倆結(jié)合起來,實(shí)現(xiàn)數(shù)組的排序了。

測試C語言實(shí)現(xiàn)的歸并排序

這里使用8個元素的數(shù)組做測試:

編譯并執(zhí)行這段C語言代碼,發(fā)現(xiàn)數(shù)組被成功排序了。

到這里,相信題主應(yīng)該明白如何使用C語言實(shí)現(xiàn)數(shù)組的歸并排序了。它和插入排序算法都屬于排序算法,但是二者的效率差異性卻很大。

程序員一般如何衡量算法的效率呢?數(shù)組的插入排序法和歸并排序法的效率差異性到底有多大呢?我之前的文章已經(jīng)比較詳細(xì)的討論過,題主可以點(diǎn)擊我的主頁查看。

歡迎在評論區(qū)一起討論,質(zhì)疑。文章都是手打原創(chuàng),每天最淺顯的介紹C語言、linux等嵌入式開發(fā),喜歡我的文章就關(guān)注一波吧,可以看到最新更新和之前的文章哦。