【基础算法】猪仔战软考之二路归并排序

【背景】

        今天米总邀请了蓓蓓老师给分享人生经验,听完课以后。所有职员要和老师一起合影。因为人太多,本来是打算分两次合影,两拨人已经分别按大小个站好了。可是由于老师赶时间只能和大家合照一次,所以两队要合到一起。这可把负责排队形的猪仔给愁坏了。
【正文】
        “这两拨人可咋合到一起啊?”
        “ 猪呀你,这有啥难得,你又不是没排过。”
        “啊,我是猪啊。啊? 我哪干过这个呀? ”
        “ /白眼 前两天咱公司项目里用二路归并解决的问题不是你写的代码?”
        “啊!归并排序!……”
         于是……
         场景再现:时空传送门  一定要看哦,精华就在这里了
         “还真是人生如代码呀!你那个归并排序的代码怎么写的?”


<span style="font-size:18px;">void Merge(List a ,List R,int h,int m,int n) //a是要排序的两队人, R是拍成之后的序列,h-m是第一队的长度,j-n是第二队的长度
{
k=h;j=m+1; //a[h]是第一波人的第一个,a[j]是第二拨人第一个。
while((h<=m)&&(j<=n)) //如果h>m 或者j>n 则证明有一波人已经完全融入到ListR(排好的队)里。如果没有就一个一个比小的先进队(ListR)
{if(a[h].key<=a[j].key)
{R[k]=a[h];h++}
else{R[k]=a[j];j++;}
k++;
}
while (h<=m){R[k]=a[h];h++;k++;} //如果按从小到大入ListR ,剩下的都是已经排好队的直接放到队尾就行。
while(j<=n){R[k]=a[j];j++;k++;}
}</span>




         “那如果是对一组数据排序呢?”
          “如果你把一组数据里的每一个数据单独当做一拨排好队的人来看不就解决了嘛”
         
<span style="font-size:18px;">  void MergePass(List a,List b,int n,int h) //h是子队列的长度
            {
                    i=1;
                    while(i<=n-2*h+1)//分三种情况,这是第一种,剩下的没合并排序的还超过2h
                     {
                      merge(a,b,i,i=h-1,i+2*h-1);//对照上边merge那段代码的参数说明
                      i+=2*h //角标向下移动2h,去找紧接着该归并排序的子序列
                      }
                    if(i+h-1<n)//第二种情况,剩下的超过h不超过2h
                     merge(a,b,i,i+h-1,n);
                    else  for (t=i;t<=n;t++)b[t]=a[t];//第三种情况,不超过h
           }</span>

 
          “看把你能的。代码呢?”
          “这儿呢!这儿呢!这就是二路归并排序的代码。”
<span style="font-size:18px;">void mergesort(List a,int n )
{ m=1;
while(m<n)
{
        mergePass(a,b,n,m);
        m=2*m;
        mergePass(b,a,n,m)
        m=2*m;   
} }
</span>



          

【总结】

           "代码书写人生,程序感悟生活。"
            "男人就一张嘴。"
            “/尴尬”



         
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 47
    评论
程序 = 数据结构 + 算法  程序是为了解决实际问而存在的。然而为了解决问,必定会使用到某些数据结构以及设计一个解决这种数据结构的算法。如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。编程实算法,不是念PPT,我们讲的就是实与代码实现与企业应用。程序 = 数据结构 + 算法                ——图灵奖得主,计算机科学家N.Wirth(沃斯)作为程序员,我们做机器学习也好,做python开发也好,java开发也好。有一种对所有程序员无一例外的刚需 —— 算法与数据结构日常增删改查 + 粘贴复制 + 搜索引擎可以实现很多东西。同样,这样也是没有任何竞争力的。我们只可以粘贴复制相似度极高的功能,稍复杂的逻辑没有任何办法。语言有很多,开发框架更是日新月异3个月不学就落后我们可以学习很多语言,很多框架,但招聘不会考你用5种语言10种框架实现同一个功能。真正让程序员有区分度,企业招聘万年不变的重点 —— 算法与数据结构。算法代表程序员水平的珠穆朗玛。如果说各种编程语言是程序员的招式,那么数据结构和算法就相当于程序员的内功。 想写出精炼、优秀的代码,不通过不断的锤炼,是很难做到的。 开这个系列的目的是为了自我不断积累。不积跬步无以至千里嘛。
评论 47
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农胖虎-java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值