[c]代码库
void MergeSort ( S_TBL *p,ElemType *rf )
{ /*对*p 表归并排序,*rf 为与*p 表等长的辅助数组*/
ElemType *q1,*q2;
q1=rf;
q2=p->elem;
for ( len=1; len<p->length; len=2*len ) /*从q2 归并到q1*/
{
for ( i=1; i+2*len-1<=p->length; i=i+2*len )
Merge ( q2,q1,i,i+len,i+2*len-1 ); /*对等长的两个子表合并*/
if ( i+len-1<p->length )
Merge ( q2,q1,i,i+len,p->length ); /*对不等长的两个子表合并*/
else if ( i<=p->length )
while ( i<=p->length ) /*若还剩下一个子表,则直接传入*/
q1[i]=q2[i];
q1<-->q2; /*交换,以保证下一趟归并时,仍从q2 归并到q1*/
if ( q1!=p->elem ) /*若最终结果不在*p 表中,则传入之*/
for ( i=1; i<=p->length; i++ )
p->elem[i]=q1[i];
}
}