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