陣前對峙
公元234年,蜀漢丞相諸葛孔明再次北伐。
一日,與司馬仲達所率魏軍兩軍相峙,二人陣前舌戰。
司馬曰:“諸葛村夫,吾與汝相鬥數年,鬥兵鬥陣鬥謀略,均已疲乏。今日,何不一改陳規,鬥點新奇玩意?”
諸葛輕撫羽扇,言道:“仲達今日想比試些什麼?”
“你我各遣相等數量兵士,立作一排,再互派一人至對方軍前,看誰派遣之人先將這一排兵士按身高從低到高排序,誰就取勝,三局兩勝制,輸者撤軍五十里,如何?”
諸葛不答,只是一邊微笑,一邊慢搖羽扇。
司馬問道:“怎麼?怕了?”
諸葛笑曰:“為將者,不通天文,不識地理,不知奇門,不曉陰陽,不明兵勢, 不學演算法,庸才耳。此乃小兒遊戲,何怕之有?”
司馬亦笑曰:“匹夫休要狂言,且比來一看。”
第一輪:插入 VS 選擇
雙方各自部署,第一輪,雙方皆出十人,少傾,列隊完畢。
蜀營王平:“丞相,末將請求出戰,以插入排序法
破之”
魏營孫禮:“大都督,末將願往,以選擇排序法
取之”
待信令一出,王平孫禮皆開始重整隊伍。
司馬觀王平策略,只見王平來到隊伍起始,依次喚後一人出列,空出其位,隨後將其與前面之人相比,若矮於前面之人,則繼續向前,直到尋出比之更矮之人,則將出列之人置於其後,原來位置之人依次後移。多次重複後,隊伍已逐漸呈自低向高之勢排列。
而另一側,魏將孫禮之法,卻有不同。只見其從第一人開始,記錄為最矮之人,隨後從第二人開始,將其身高與最矮之人身高相比,一旦發現比最矮之人還小,則更新最矮之人編號為當前之人,一趟下來直至隊伍末尾,便知曉誰是整個隊伍最矮之人,將其與隊伍第一位置交換,最矮之人便來到隊伍最前面。接著從第二位置重複以上過程,逐步獲取次矮之人,不多時,隊伍亦逐漸呈自低向高之勢排列。
兩人幾乎同時完成整個隊伍的排序,然蜀將王平以微小優勢領先完成,此一輪,蜀勝。
第二輪:冒泡 VS 希爾
第二輪,雙方皆出百人,少傾,列隊完畢。
蜀營魏延請命:“丞相,末將請求出戰,以快速排序法
定能取勝”
諸葛曰:“殺雞焉用牛刀,區區百人之隊,氣泡排序法
足矣,此一輪還是讓馬岱出戰吧”
魏延面露不悅。
蜀營派馬岱出戰,魏營遣郭淮出戰。
待信令一出,二人皆開始調整隊伍。
馬岱來到隊首,只見其從第一人開始,比較第一人與第二人之高矮,若第一人高於第二人,則交換兩人站位。繼續比較第二人與第三人,一趟結束,最末尾之人便為隊伍中最高之人。接著來到隊伍開頭,故技重施,不斷交換,一直將隊伍中次高之人交換到倒數第二的位置。
司馬觀之,嘆曰:“諸葛亮徒有虛名,竟派馬岱使用氣泡排序法
,大量交換費時費力,我軍穩操勝券了”
此刻,魏延大急:“丞相,那郭淮使的什麼方法,像插入法又不像插入法,眼看就要完成了,丞相真該派我出戰”
諸葛不語,一旁王平言道:“上將軍,依末將愚見,此貌似縮小增量排序法,又名希爾排序法
,由插入排序法改進而來,早年由西域傳入中原”。
片刻之後,郭淮率先完成隊伍排列,此一輪,魏勝。
第三輪:歸併 VS ??
第三輪,雙方佇列增至千人。
蜀營魏延再次請求出戰。
諸葛問魏延:“文長(魏延,字文長)啊,你打算以何演算法破之?”
魏延答:“丞相,末將方才已經告知,予以快速排序法
破之”
諸葛搖頭,“不可”
魏延不解,“有何不可?”
諸葛復曰:“我觀司馬懿此一輪必遣其子司馬昭出戰,司馬昭此人我素有耳聞,同樣擅使快速排序法
,若你二人均以此法上陣,你可有把握勝之?”
魏延搖頭:“倘若如此,末將並無十足把握”
諸葛輕揮羽扇,“此一局不宜使用快速排序法
,姜維過來,本相另有良策傳授與你”
魏延憤懣不平:“丞相為何視我為無物,末將不服”。
諸葛笑曰:“文長休急,本相另有重任相托”。
魏延大喜。
另一方魏營,司馬昭曰:“父親,孩兒研習快速排序法
多年,此一輪願請出戰”
仲達怒斥:“軍中無父子!”
昭大驚,改口:“是,大都督”
仲達緩捋長鬚,曰:“此一輪,不可用快速排序法
”
昭不明:“這是為何?”
“快速排序法
之要害,在於選擇基準參考,並將隊伍劃分為矮於基準之人部分和高於基準之人部分。再縮小範圍,複用此法,直至整個隊伍有序。”
昭曰:“父親,,,大都督所言不錯,可為何不能使用此法?”
仲達指著隊伍,言道:“諸將請看,千人之隊,必有大量身高相等之人,若以快速排序法
,勢必做大量無用位置交換,徒耗不少功夫。快速排序法
名曰快速,切不可紙上談兵,還需審時度勢,靈活變通才是”
司馬昭點頭,深以為然:“還是大都督老謀深算,末將雖研習多年,尤未可及也”
仲達於司馬昭耳畔竊言數語,隨即遣之出戰。
司馬昭來到隊伍前面,將隊伍分作兩半,又將每一半繼續分作兩半,直至無可再分。接著按照大小合併每一個細分的部分為有序隊伍,又進一步將這些有序隊伍合併成更大的有序隊伍,直至合併所有兵士為整體的有序隊伍。
司馬問道:“孔明,你可識得我兒司馬昭所用排序之法?”
諸葛笑答:“別說是我,我蜀中三尺孩童也識得,此乃歸併排序法
,是也不是?”
司馬未露聲色,回看姜維,一不留神,姜維所排隊伍竟已近尾聲。
諸葛察之,問道:“仲達可識得姜維所用排序之法?”
司馬細細觀之,只見姜維從隊首至隊尾,依次詢問所有人身高,並記錄整個隊伍之最矮與最高者,最終得最矮者六尺二寸,最高者八尺三寸。隨即從六尺二寸、六尺三寸、六尺四寸,直至八尺二寸、八尺三寸共劃分為二十二組。隨後將所有人依次分入各組,再將各組依序合併。 千人之隊,不待半個時辰,竟將完成。
片刻之後,姜維完成佇列排序,此一輪,蜀勝。
司馬仍未露聲色,悄然返回軍中,謂之左右曰:“諸葛亮果然有些本事,我不如也”
三局兩勝,司馬失利,依約後撤五十里,高掛免戰牌,自此堅守不出。
彩蛋
撤軍路上,昭問仲達:“大都督,蜀將姜維所用何法,竟能如此神速?”
不待仲達開口,前方一哨騎回報:“報~,大都督,蜀將魏延趁兩軍對峙,親率兩萬鐵騎攻我大營,我守將不備,大營給,給丟了”
司馬怒目圓睜,摔下馬去。
文中動圖來源
《十大經典排序演算法(動圖演示)》:https://www.cnblogs.com/onepixel/articles/7674659.html
作者:一畫素