排序算法--归并排序

归并:

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

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

 

归并排序的优点:

就是无论什么样的输入,它对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 ];
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值