归并:
将两个排好序的文件组合成一个更大的有序文件。
归并排序的优点:
就是无论什么样的输入,它对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 ]; }