合并排序

合并排序是通过分治法对n个元素的排序的算法。当n=1时终止排序。否则向排序元素分为大小相同的两个子集,分别对两个子集进行排序。最终将排过序的子集进行合并。

void MergeSort (Type a[],int left ,int right )
{
	if (left ,right )
	{
		int i = (left + right )/2;
		MergeSort (a,left ,i );
		MergeSort (a, i+1,right );
		Merge (a , b , left , i , right)		//合并数组
		Copy (a,b,left ,right);
	}

通过计算可知道 Merge和Copy的时间复杂度为O(n)所以该合并法的时间复杂度T(n)=4t(n/2)+O(n)
对于MergeSort的递归将排序集合一分为二,直至剩余一个元素,然后不断合并排序的数组,通过循环可以将数组相邻元素两两配对,通过合并算法构成n/2族长度为2的子数组,如此循环,即可完成排序。

void MergeSort (Type a[],int n)
{
	Type * b = new Type [n];
	int s = 1;
	while ( s < n )
	{
		MergePass (a,b,s,n);
		s += s;
		MergePass (b,a,s,n);
		s += s;
	}
}
void MergePass (Type x[],Type y[],int s , int n)		//合并大小为s的相邻子数组
{
	int i=0;
	while ( i <= n - 2 * s)
	{
		Merge ( x , y , i , i + s - 1 ,i + 2 * s - 1);
		i = i +2 * s;
	}
	if ( i + s < n )Merge ( x , y , i , i + s - 1 , n - 1);
	else 
	{
		for (int j = i ; j  <= n - 1; j++)
		y [j]=x [j];
	}
void Merge (Type c[],Type d[] , int l , int m , int r)
{
	int i = 1 ;
	int j = m + 1;
	int k = l;
	whle (( i <= m ) && ( j < = r ))
	if ( c [i] <= c[j]) 
		d [k++] = c [i++];
		else 
			d [k++] = c[ j++];
		if ( i > m )
		{
			for (int q=j ;q <= r ; q++)
				d[k++] = c[q];
		}
		else 
		{
			for (int q=i ;q <= m ; q++)
			d[k++] = c[q];
		}	
}

自然合并排序是Merge合并排序的一个变形。对与出使给定的数组,通常存在多个长度大于1的自然排好序的自然数组。通过对数组的线性扫描就足以找出所有这些排好序的子数组段。然后进行两两组合,构成更大的子数组段。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值