【背景】
今天米总邀请了蓓蓓老师给分享人生经验,听完课以后。所有职员要和老师一起合影。因为人太多,本来是打算分两次合影,两拨人已经分别按大小个站好了。可是由于老师赶时间只能和大家合照一次,所以两队要合到一起。这可把负责排队形的猪仔给愁坏了。
【正文】
于是……
场景再现:时空传送门 一定要看哦,精华就在这里了
<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>