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]; |
} |
} |