排序算法--归并排序

归并:

将两个排好序的文件组合成一个更大的有序文件。

选择和归并互补,选择将一个文件分解成两个独立的文件,而归并将两个独立的文件合并成一个文件。

归并排序的优点:
就是无论什么样的输入,它对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 ];
}



猜你喜欢

转载自blog.csdn.net/u010034085/article/details/80015319