归并:
将两个排好序的文件组合成一个更大的有序文件。
选择和归并互补,选择将一个文件分解成两个独立的文件,而归并将两个独立的文件合并成一个文件。
归并排序的优点:
就是无论什么样的输入,它对N个元素文件的排序所需时间与NlogN成正比。
并可以顺序的访问数据。
其缺点:
就是所需的空间与N成正比。
自顶向下归并排序:
是将一个大的任务分成几个可以独立解决的部分,将它们分配给各下属人员解决,各个下属人员对其下属再分配,直到没有下属人员获得了任务。
算法思路:
通过将a[l],...,a[r]分成两部分a[l],...,a[m]和a[m+1],...,a[r]来排序,并对它们独立的进行排序(使用递归)。然后将得到的排好序的文件合并,得到最终排好序的文件。
void Mergesort( ElementType A[ ], int N )
{
ElementType *TmpArray;
TmpArray = malloc( N * sizeof( ElementType ) );/*分配一个辅助空间*/
if( TmpArray != NULL )
{
MSort( A, TmpArray, 0, N - 1 );
free( TmpArray );
}
else
FatalError( "No space for tmp array!!!" );
}
void MSort( ElementType A[ ], ElementType TmpArray[ ],int Left, int Right )
{
int Center;
if( Left < Right )
{
Center = ( Left + Right ) / 2;
MSort( A, TmpArray, Left, Center );/*自顶向下归并*/
MSort( A, TmpArray, Center + 1, Right );
Merge( A, TmpArray, Left, Center + 1, Right );
}
}
void Merge( ElementType A[ ], ElementType TmpArray[ ], int Lpos, int Rpos, int RightEnd )
{
int i, LeftEnd, NumElements, TmpPos;
LeftEnd = Rpos - 1;
TmpPos = Lpos;
NumElements = RightEnd - Lpos + 1;
/* main loop */
while( Lpos <= LeftEnd && Rpos <= RightEnd )
if( A[ Lpos ] <= A[ Rpos ] )
TmpArray[ TmpPos++ ] = A[ Lpos++ ];
else
TmpArray[ TmpPos++ ] = A[ Rpos++ ];
while( Lpos <= LeftEnd ) /* Copy rest of first half */
TmpArray[ TmpPos++ ] = A[ Lpos++ ];
while( Rpos <= RightEnd ) /* Copy rest of second half */
TmpArray[ TmpPos++ ] = A[ Rpos++ ];
/* Copy TmpArray back */
for( i = 0; i < NumElements; i++, RightEnd-- )
A[ RightEnd ] = TmpArray[ RightEnd ];
}