经典排序算法5——归并排序

归并排序思想:将待排序列看为n个子序列,每个子序列的长 度为1,然后两两归并,得到n/2个长度为2或1的有序子序列,再两两归并直到得到一个长度为n的有序序列为止。

归并排序的核心是一分解数据,二合并数据。

递归拆分数组:

void SeparateArray(int a[],int l,int r,int temp[])
{
	if (l<r)
	{
		int m=(l+r)/2;
		SeparateArray(a,l,m,temp);
		SeparateArray(a,m+1,r,temp);
		MergeArray(a,l,m,r,temp);
	}
	return;
}

合并数组:

void MergeArray(int a[],int begin,int mid,int end,int temp[])
{
	int i=begin,j=mid+1,k=0;
	while(i<=mid && j<=end)
	{
		if (a[i]<a[j])
		{
			temp[k++]=a[i++];
		}
		else
		{
			temp[k++]  = a[j++];
		}
	}
	while(i<=mid)
		temp[k++]=a[i++];
	while(j<=end)
		temp[k++]  = a[j++];
	for (i=0;i<k;i++)
	{
		a[begin+i]=temp[i];
	}
}
MergeSort(int a[],int n)
{
	int *temp=new int[n];
	if (temp==NULL)
	{
		return;
	}
	SeparateArray(a,0,n-1,temp);
	delete []temp;
}

归并排序的键值比较次数,最差效率 递推式:C(n)=nlog_{2}n-n+1

归并排序在最坏情况下的键值比较次数十分接近于任何基于比较的排序算法在理论上能够达到的最少次数,但其主要缺点是该算法需要线性的额外空间。

猜你喜欢

转载自blog.csdn.net/zxycele/article/details/81512049
今日推荐