mydjm

 

合并排序

#include<stdio.h>
#define MAX_INT 65535//哨兵
void Merge(int *a,int p,int q,int r)//关键函数~ 合并
{
	int L[50],R[50],b[100],i,j,k;
	int len1=q-p+1;
	int len2=r-q;
	for(i=0;i<len1;i++)
	{
		L[i] = a[p+i];
	}

	L[len1]=MAX_INT;
	//L[len1]=600;
	for(i=0;i<len2;i++)
	{
		R[i] = a[q+1+i];
	}

	R[len2] = MAX_INT;
	//R[len2]=600;
	i=0;j=0;
	for(k=0;k<r-p+1;k++)
	{
		if(L[i]>R[j])
		{
			b[k]=R[j];
			j++;
		}
		else
		{
			b[k]=L[i];
			i++;
		}
	}

	for(i=0;i<r-p+1;i++)//把这个忘了就出错了。。
		a[p+i]=b[i];

}

void MergeSort(int *a,int p,int q)//递归调用
{
	int m;
	if(p<q)
	{
		m=(p+q)/2;
		MergeSort(a,p,m);
		MergeSort(a,m+1,q);
		Merge(a,p,m,q);
	}
	else return;
}

int main()
{
	int b[100],n,i;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		scanf("%d",&b[i]);
	}
	MergeSort(b,0,n-1);

	for(i=0;i<n;i++)
	{
		printf("%d ",b[i]);
	}
	return 1;
}

  运行截图:

 

看着算法导论写的代码,只不过忘了合并排序不是原地排序的,居然每次把排好的结果直接赋值给原数组。。于是出错了~

posted on 2012-03-20 18:53  mydjm  阅读(186)  评论(0编辑  收藏  举报

导航