1. 程式人生 > >諸葛亮vs司馬懿,排序演算法大戰誰能笑到最後?

諸葛亮vs司馬懿,排序演算法大戰誰能笑到最後?

## 陣前對峙 公元234年,蜀漢丞相諸葛孔明再次北伐。 一日,與司馬仲達所率魏軍兩軍相峙,二人陣前舌戰。 ![](https://imgkr.cn-bj.ufileos.com/1626f80e-9868-43cc-ba2c-aacd7b75b1dd.png) 司馬曰:“諸葛村夫,吾與汝相鬥數年,鬥兵鬥陣鬥謀略,均已疲乏。今日,何不一改陳規,鬥點新奇玩意?” 諸葛輕撫羽扇,言道:“仲達今日想比試些什麼?” ![](https://imgkr.cn-bj.ufileos.com/ee65df84-ac97-4a3e-8711-fe35aa4bbe31.png) “你我各遣相等數量兵士,立作一排,再互派一人至對方軍前,看誰派遣之人先將這一排兵士按身高從低到高排序,誰就取勝,三局兩勝制,輸者撤軍五十里,如何?” 諸葛不答,只是一邊微笑,一邊慢搖羽扇。 司馬問道:“怎麼?怕了?” 諸葛笑曰:“為將者,不通天文,不識地理,不知奇門,不曉陰陽,不明兵勢, 不學演算法,庸才耳。此乃小兒遊戲,何怕之有?” ![](https://imgkr.cn-bj.ufileos.com/0ce20572-b581-429f-9e98-e17062c204b2.png) 司馬亦笑曰:“匹夫休要狂言,且比來一看。” ## 第一輪:插入 VS 選擇 雙方各自部署,第一輪,雙方皆出十人,少傾,列隊完畢。 蜀營王平:“丞相,末將請求出戰,以`插入排序法`破之” 魏營孫禮:“大都督,末將願往,以`選擇排序法`取之” 待信令一出,王平孫禮皆開始重整隊伍。 司馬觀王平策略,**只見王平來到隊伍起始,依次喚後一人出列,空出其位,隨後將其與前面之人相比,若矮於前面之人,則繼續向前,直到尋出比之更矮之人,則將出列之人置於其後,原來位置之人依次後移。多次重複後,隊伍已逐漸呈自低向高之勢排列**。 ![](https://imgkr.cn-bj.ufileos.com/5423fd5d-82d1-405d-83e7-9853289ceb1c.gif) 而另一側,魏將孫禮之法,卻有不同。**只見其從第一人開始,記錄為最矮之人,隨後從第二人開始,將其身高與最矮之人身高相比,一旦發現比最矮之人還小,則更新最矮之人編號為當前之人,一趟下來直至隊伍末尾,便知曉誰是整個隊伍最矮之人,將其與隊伍第一位置交換,最矮之人便來到隊伍最前面。接著從第二位置重複以上過程,逐步獲取次矮之人,不多時,隊伍亦逐漸呈自低向高之勢排列**。 ![](https://imgkr.cn-bj.ufileos.com/605f51c1-6fad-47ac-8e71-ab67a05e5027.gif) 兩人幾乎同時完成整個隊伍的排序,然蜀將王平以微小優勢領先完成,此一輪,蜀勝。 ## 第二輪:冒泡 VS 希爾 第二輪,雙方皆出百人,少傾,列隊完畢。 蜀營魏延請命:“丞相,末將請求出戰,以`快速排序法`定能取勝” 諸葛曰:“殺雞焉用牛刀,區區百人之隊,`氣泡排序法`足矣,此一輪還是讓馬岱出戰吧” 魏延面露不悅。 蜀營派馬岱出戰,魏營遣郭淮出戰。 待信令一出,二人皆開始調整隊伍。 馬岱來到隊首,**只見其從第一人開始,比較第一人與第二人之高矮,若第一人高於第二人,則交換兩人站位。繼續比較第二人與第三人,一趟結束,最末尾之人便為隊伍中最高之人。接著來到隊伍開頭,故技重施,不斷交換,一直將隊伍中次高之人交換到倒數第二的位置。** ![](https://imgkr.cn-bj.ufileos.com/90abd684-7fcf-47ad-b82b-ffb8acc1489e.gif) 司馬觀之,嘆曰:“諸葛亮徒有虛名,竟派馬岱使用`氣泡排序法`,大量交換費時費力,我軍穩操勝券了” 此刻,魏延大急:“丞相,那郭淮使的什麼方法,像插入法又不像插入法,眼看就要完成了,丞相真該派我出戰” ![](https://imgkr.cn-bj.ufileos.com/18fa6e17-1cdf-4c45-add0-7cde4f57ae54.gif) 諸葛不語,一旁王平言道:“上將軍,依末將愚見,此貌似縮小增量排序法,又名`希爾排序法`,由插入排序法改進而來,早年由西域傳入中原”。 片刻之後,郭淮率先完成隊伍排列,此一輪,魏勝。 ## 第三輪:歸併 VS ?? 第三輪,雙方佇列增至千人。 蜀營魏延再次請求出戰。 諸葛問魏延:“文長(魏延,字文長)啊,你打算以何演算法破之?” 魏延答:“丞相,末將方才已經告知,予以`快速排序法`破之” 諸葛搖頭,“不可” 魏延不解,“有何不可?” 諸葛復曰:“我觀司馬懿此一輪必遣其子司馬昭出戰,司馬昭此人我素有耳聞,同樣擅使`快速排序法`,若你二人均以此法上陣,你可有把握勝之?” 魏延搖頭:“倘若如此,末將並無十足把握” 諸葛輕揮羽扇,“此一局不宜使用`快速排序法`,姜維過來,本相另有良策傳授與你” ![](https://imgkr.cn-bj.ufileos.com/9c4b24f4-9f54-41b6-8008-40a9749da7f6.png) 魏延憤懣不平:“丞相為何視我為無物,末將不服”。 諸葛笑曰:“文長休急,本相另有重任相托”。 魏延大喜。 另一方魏營,司馬昭曰:“父親,孩兒研習`快速排序法`多年,此一輪願請出戰” 仲達怒斥:“軍中無父子!” 昭大驚,改口:“是,大都督” 仲達緩捋長鬚,曰:“此一輪,不可用`快速排序法`” 昭不明:“這是為何?” “**`快速排序法`之要害,在於選擇基準參考,並將隊伍劃分為矮於基準之人部分和高於基準之人部分。再縮小範圍,複用此法,直至整個隊伍有序。**” ![](https://imgkr.cn-bj.ufileos.com/f036cfd8-6d6b-499a-9d4c-1f1d84a6dc5d.gif) 昭曰:“父親,,,大都督所言不錯,可為何不能使用此法?” 仲達指著隊伍,言道:“諸將請看,千人之隊,必有大量身高相等之人,若以`快速排序法`,勢必做大量無用位置交換,徒耗不少功夫。`快速排序法`名曰快速,切不可紙上談兵,還需審時度勢,靈活變通才是” 司馬昭點頭,深以為然:“還是大都督老謀深算,末將雖研習多年,尤未可及也” 仲達於司馬昭耳畔竊言數語,隨即遣之出戰。 --- 司馬昭來到隊伍前面,**將隊伍分作兩半,又將每一半繼續分作兩半,直至無可再分。接著按照大小合併每一個細分的部分為有序隊伍,又進一步將這些有序隊伍合併成更大的有序隊伍,直至合併所有兵士為整體的有序隊伍**。 ![](https://imgkr.cn-bj.ufileos.com/2fce1971-1328-4a8f-b7d8-509b90904e26.gif) 司馬問道:“孔明,你可識得我兒司馬昭所用排序之法?” 諸葛笑答:“別說是我,我蜀中三尺孩童也識得,此乃`歸併排序法`,是也不是?” 司馬未露聲色,回看姜維,一不留神,姜維所排隊伍竟已近尾聲。 諸葛察之,問道:“仲達可識得姜維所用排序之法?” 司馬細細觀之,只見姜維**從隊首至隊尾,依次詢問所有人身高,並記錄整個隊伍之最矮與最高者,最終得最矮者六尺二寸,最高者八尺三寸。隨即從六尺二寸、六尺三寸、六尺四寸,直至八尺二寸、八尺三寸共劃分為二十二組。隨後將所有人依次分入各組,再將各組依序合併。** 千人之隊,不待半個時辰,竟將完成。 ![](https://imgkr.cn-bj.ufileos.com/352f74bb-a17d-47ff-88cc-bb3d9293fd61.gif) 片刻之後,姜維完成佇列排序,此一輪,蜀勝。 司馬仍未露聲色,悄然返回軍中,謂之左右曰:“諸葛亮果然有些本事,我不如也” 三局兩勝,司馬失利,依約後撤五十里,高掛免戰牌,自此堅守不出。 ## 彩蛋 > 撤軍路上,昭問仲達:“大都督,蜀將姜維所用何法,竟能如此神速?” > > 不待仲達開口,前方一哨騎回報:“報~,大都督,蜀將魏延趁兩軍對峙,親率兩萬鐵騎攻我大營,我守將不備,大營給,給丟了” > > 司馬怒目圓睜,摔下馬去。 --- > *文中動圖來源* > > 《十大經典排序演算法(動圖演示)》:https://www.cnblogs.com/onepixel/articles/7674659.html > > 作者:一畫素 ## 往期熱門回顧 [因為一個跨域請求,我差點丟了飯碗](https://mp.weixin.qq.com/s/K15IVpe57STOf0SxyLEg9A) [一個神祕URL釀大禍,差點讓我背鍋!](https://mp.weixin.qq.com/s/sqOvQsz5YVR-RAzNmePD2A) [就為了一個原子操作,其他CPU核心都罷工了](https://mp.weixin.qq.com/s/jx0EajGXGrM3fR14P9Bm7Q) [完了!CPU一味求快出事兒了!](https://mp.weixin.qq.com/s/jx0EajGXGrM3fR14P9Bm7Q) [可怕!CPU竟成了黑客的幫凶!](https://mp.weixin.qq.com/s/XEDCCQntIRghWhfigciWSA) [雜湊表哪家強?幾大程式語言吵起來了!](https://mp.weixin.qq.com/s/erSqe-nItuQPxW4MT3LEVg) [震撼!全網第一張原始碼分析全景圖揭祕Nginx](https://mp.weixin.qq.com/s/mhsIoabAVOyTrBXKGZjD_g) [一網打盡!每個程式猿都該瞭解的黑客技術大彙總](https://mp.weixin.qq.com/s/KZ3-PeYWBBos40spbqiTRA) [DDoS攻擊:無限戰爭](https://mp.weixin.qq.com/s/CYoaJfV9btYBFWD7ZGLVng) [一個Java物件的回憶錄:垃圾回收](https://mp.weixin.qq.com/s/QWuhgrT7LEqq06NxdvfaeA) [誰動了你的HTTPS流量?](https://mp.weixin.qq.com/s/OZ6ZOoGULUgRRaL_qw9bFA) [路由器裡的廣告祕密](https://mp.weixin.qq.com/s/1_pDD-V4Qa5k22NOoruNMg) [一個HTTP資料包的奇幻之旅](https://mp.weixin.qq.com/s/axPUi-8kHtFQTwgRtyZtGQ) [我是一個流氓軟體執行緒](https://mp.weixin.qq.com/s/YDEwVD9MudthkTTCshJF3w) ![](https://imgkr.cn-bj.ufileos.com/62b181b0-cb63-47a0-b836-131de3a562c7.png) ![](https://imgkr.cn-bj.ufileos.com/06d25f4e-bd38-404b-a901-173737bb7ccf.png)