阵前对峙

公元234年,蜀汉丞相诸葛孔明再次北伐。

一日,与司马仲达所率魏军两军相峙,二人阵前舌战。

司马曰:“诸葛村夫,吾与汝相斗数年,斗兵斗阵斗谋略,均已疲乏。今日,何不一改陈规,斗点新奇玩意?”

诸葛轻抚羽扇,言道:“仲达今日想比试些什么?”

“你我各遣相等数量兵士,立作一排,再互派一人至对方军前,看谁派遣之人先将这一排兵士按身高从低到高排序,谁就取胜,三局两胜制,输者撤军五十里,如何?”

诸葛不答,只是一边微笑,一边慢摇羽扇。

司马问道:“怎么?怕了?”

诸葛笑曰:“为将者,不通天文,不识地理,不知奇门,不晓阴阳,不明兵势, 不学算法,庸才耳。此乃小儿游戏,何怕之有?”

司马亦笑曰:“匹夫休要狂言,且比来一看。”

第一轮:插入 VS 选择

双方各自部署,第一轮,双方皆出十人,少倾,列队完毕。

蜀营王平:“丞相,末将请求出战,以插入排序法破之”

魏营孙礼:“大都督,末将愿往,以选择排序法取之”

待信令一出,王平孙礼皆开始重整队伍。

司马观王平策略,只见王平来到队伍起始,依次唤后一人出列,空出其位,随后将其与前面之人相比,若矮于前面之人,则继续向前,直到寻出比之更矮之人,则将出列之人置于其后,原来位置之人依次后移。多次重复后,队伍已逐渐呈自低向高之势排列

而另一侧,魏将孙礼之法,却有不同。只见其从第一人开始,记录为最矮之人,随后从第二人开始,将其身高与最矮之人身高相比,一旦发现比最矮之人还小,则更新最矮之人编号为当前之人,一趟下来直至队伍末尾,便知晓谁是整个队伍最矮之人,将其与队伍第一位置交换,最矮之人便来到队伍最前面。接着从第二位置重复以上过程,逐步获取次矮之人,不多时,队伍亦逐渐呈自低向高之势排列

两人几乎同时完成整个队伍的排序,然蜀将王平以微小优势领先完成,此一轮,蜀胜。

第二轮:冒泡 VS 希尔

第二轮,双方皆出百人,少倾,列队完毕。

蜀营魏延请命:“丞相,末将请求出战,以快速排序法定能取胜”

诸葛曰:“杀鸡焉用牛刀,区区百人之队,冒泡排序法足矣,此一轮还是让马岱出战吧”

魏延面露不悦。

蜀营派马岱出战,魏营遣郭淮出战。

待信令一出,二人皆开始调整队伍。

马岱来到队首,只见其从第一人开始,比较第一人与第二人之高矮,若第一人高于第二人,则交换两人站位。继续比较第二人与第三人,一趟结束,最末尾之人便为队伍中最高之人。接着来到队伍开头,故技重施,不断交换,一直将队伍中次高之人交换到倒数第二的位置。

司马观之,叹曰:“诸葛亮徒有虚名,竟派马岱使用冒泡排序法,大量交换费时费力,我军稳操胜券了”

此刻,魏延大急:“丞相,那郭淮使的什么方法,像插入法又不像插入法,眼看就要完成了,丞相真该派我出战”

诸葛不语,一旁王平言道:“上将军,依末将愚见,此貌似缩小增量排序法,又名希尔排序法,由插入排序法改进而来,早年由西域传入中原”。

片刻之后,郭淮率先完成队伍排列,此一轮,魏胜。

第三轮:归并 VS ??

第三轮,双方队列增至千人。

蜀营魏延再次请求出战。

诸葛问魏延:“文长(魏延,字文长)啊,你打算以何算法破之?”

魏延答:“丞相,末将方才已经告知,予以快速排序法破之”

诸葛摇头,“不可”

魏延不解,“有何不可?”

诸葛复曰:“我观司马懿此一轮必遣其子司马昭出战,司马昭此人我素有耳闻,同样擅使快速排序法,若你二人均以此法上阵,你可有把握胜之?”

魏延摇头:“倘若如此,末将并无十足把握”

诸葛轻挥羽扇,“此一局不宜使用快速排序法,姜维过来,本相另有良策传授与你”

魏延愤懑不平:“丞相为何视我为无物,末将不服”。

诸葛笑曰:“文长休急,本相另有重任相托”。

魏延大喜。

另一方魏营,司马昭曰:“父亲,孩儿研习快速排序法多年,此一轮愿请出战”

仲达怒斥:“军中无父子!”

昭大惊,改口:“是,大都督”

仲达缓捋长须,曰:“此一轮,不可用快速排序法

昭不明:“这是为何?”

快速排序法之要害,在于选择基准参考,并将队伍划分为矮于基准之人部分和高于基准之人部分。再缩小范围,复用此法,直至整个队伍有序。

昭曰:“父亲,,,大都督所言不错,可为何不能使用此法?”

仲达指着队伍,言道:“诸将请看,千人之队,必有大量身高相等之人,若以快速排序法,势必做大量无用位置交换,徒耗不少功夫。快速排序法名曰快速,切不可纸上谈兵,还需审时度势,灵活变通才是”

司马昭点头,深以为然:“还是大都督老谋深算,末将虽研习多年,尤未可及也”

仲达于司马昭耳畔窃言数语,随即遣之出战。


司马昭来到队伍前面,将队伍分作两半,又将每一半继续分作两半,直至无可再分。接着按照大小合并每一个细分的部分为有序队伍,又进一步将这些有序队伍合并成更大的有序队伍,直至合并所有兵士为整体的有序队伍

司马问道:“孔明,你可识得我儿司马昭所用排序之法?”

诸葛笑答:“别说是我,我蜀中三尺孩童也识得,此乃归并排序法,是也不是?”

司马未露声色,回看姜维,一不留神,姜维所排队伍竟已近尾声。

诸葛察之,问道:“仲达可识得姜维所用排序之法?”

司马细细观之,只见姜维从队首至队尾,依次询问所有人身高,并记录整个队伍之最矮与最高者,最终得最矮者六尺二寸,最高者八尺三寸。随即从六尺二寸、六尺三寸、六尺四寸,直至八尺二寸、八尺三寸共划分为二十二组。随后将所有人依次分入各组,再将各组依序合并。 千人之队,不待半个时辰,竟将完成。

片刻之后,姜维完成队列排序,此一轮,蜀胜。

司马仍未露声色,悄然返回军中,谓之左右曰:“诸葛亮果然有些本事,我不如也”

三局两胜,司马失利,依约后撤五十里,高挂免战牌,自此坚守不出。

彩蛋

撤军路上,昭问仲达:“大都督,蜀将姜维所用何法,竟能如此神速?”

不待仲达开口,前方一哨骑回报:“报~,大都督,蜀将魏延趁两军对峙,亲率两万铁骑攻我大营,我守将不备,大营给,给丢了”

司马怒目圆睁,摔下马去。


文中动图来源

《十大经典排序算法(动图演示)》:https://www.cnblogs.com/onepixel/articles/7674659.html

作者:一像素

往期热门回顾

因为一个跨域请求,我差点丢了饭碗

一个神秘URL酿大祸,差点让我背锅!

就为了一个原子操作,其他CPU核心都罢工了

完了!CPU一味求快出事儿了!

可怕!CPU竟成了黑客的帮凶!

哈希表哪家强?几大编程语言吵起来了!

震撼!全网第一张源码分析全景图揭秘Nginx

一网打尽!每个程序猿都该了解的黑客技术大汇总

DDoS攻击:无限战争

一个Java对象的回忆录:垃圾回收

谁动了你的HTTPS流量?

路由器里的广告秘密

一个HTTP数据包的奇幻之旅

我是一个流氓软件线程

诸葛亮vs司马懿,排序算法大战谁能笑到最后?的更多相关文章

  1. JavaScript实现常用的排序算法

    ▓▓▓▓▓▓ 大致介绍 由于最近要考试复习,所以学习js的时间少了 -_-||,考试完还会继续的努力学习,这次用原生的JavaScript实现以前学习的常用的排序算法,有冒泡排序.快速排序.直接插入排 ...

  2. 排序算法----基数排序(RadixSort(L))单链表智能版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  3. 常见排序算法(附java代码)

    常见排序算法与java实现 一.选择排序(SelectSort) 基本原理:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换:接着对不包括第一个记录以外的其他 ...

  4. 几大排序算法的Java实现

    很多的面试题都问到了排序算法,中间的算法和思想比较重要,这边我选择了5种常用排序算法并用Java进行了实现.自己写一个模板已防以后面试用到.大家可以看过算法之后,自己去实现一下. 1.冒泡排序:大数向 ...

  5. 排序算法----基数排序(RadixSort(L,max))单链表版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  6. 排序算法汇总(C/C++实现)

    前言:     本人自接触算法近2年以来,在不断学习中越多地发觉各种算法中的美妙.之所以在这方面过多的投入,主要还是基于自身对高级程序设计的热爱,对数学的沉迷.回想一下,先后也曾参加过ACM大大小小的 ...

  7. 用Java来写常见的排序算法

    随着校招的临近 算法是校招中很重要的一个部分 总结了常见几种排序算法,各种算法的时间复杂度和空间复杂度大家也需要多了解下 package com.huwei.sort; /** * 各种排序算法 * ...

  8. 模板化的七种排序算法,适用于T* vector<T>以及list<T>

    最近在写一些数据结构以及算法相关的代码,比如常用排序算法以及具有启发能力的智能算法.为了能够让写下的代码下次还能够被复用,直接将代码编写成类模板成员函数的方式,之所以没有将这种方式改成更方便的函数模板 ...

  9. 排序算法总结第二弹----冒泡排序---javascript描述

    上篇博文总结了选择排序,这篇来看冒泡排序,接上篇. 冒泡排序思想:若是正再将一组数据升序排序, 第一趟:比较相邻的数据,当左侧值大于右侧值将他们进行交换,将较小值向前浮动,大值向后冒泡,直至比较到最后 ...

随机推荐

  1. ruoyi-plus-server(一):引入Mybatis-Plus

    背景:著名开源管理系统ruoyi-vue是基于SpringBoot,Spring Security,JWT,Vue & Element 的前后端分离权限管理系统(https://gitee.c ...

  2. centos7安装后不能连接外网

    测试外网: 1,测访问外网能力:curl -l http://www.baidu.com 2,测访问外网能力:wget http://www.baidu.com 注:ping命令不一定能正确反映系统的 ...

  3. intellij tomcat

    VMOption -server -XX:PermSize=128M -XX:MaxPermSize=256m

  4. Spring 由构造函数自动装配

    Spring 由构造函数自动装配,这种模式与 byType 非常相似,但它应用于构造器参数. Spring 容器看作 beans,在 XML 配置文件中 beans 的 autowire 属性设置为 ...

  5. Hyperledger Fabric——balance transfer(三)创建和加入Channel

    详细解析blance transfer示例的创建通道(Channel)和加入节点到通道的过程. 创建Channel 1.首先看app.js的路由函数 var createChannel = requi ...

  6. Text Reverse(hdu1062)

    输入方式:先输入整数,再循环输入字符串. 思考:字符串中有空格.那么要在字符串大循环输入前,首先,用"getchar()"函数读取scanf_s()函数缓冲区的空格或者空行或者换行 ...

  7. 带你学够浪:Go语言基础系列 - 8分钟学基础语法

    对于一般的语言使用者来说 ,20% 的语言特性就能够满足 80% 的使用需求,剩下在使用中掌握. 基于这一理论,Go 基础系列的文章不会刻意追求面面俱到,但该有知识点都会覆盖,目的是带你快跑赶上 Go ...

  8. 树莓派安装pip3以及扩展包的方法

    树莓派上有的时候需要安装一些python额外的包,但上面没有安装pip3,因此需要动手去安装pip3,之后用来安装拓展包. 1.首先安装setuptools cd /usr/local/src/ su ...

  9. Keepalived 原理与实战

    Keepalived 原理与实战 随着系统架构的逐渐演化,服务器的数量和结构会越来越复杂,例如 Web 服务器集群的搭建,提高了系统的性能,同时也提高了系统维护的复杂度,我们需要对集群中各台服务器进行 ...

  10. 一文讲透Modbus协议

    前言 Modbus是一种串行通讯协议,是Modicon公司(现在的施耐德电气 Schneider Electric) 于1979年为使用可编程逻辑控制器(PLC)通信而发表.Modbus已经成为工业领 ...