鹰之歌

既然你崇拜鹰,就要像鹰一样翱翔天际,俯瞰大地。哪怕会摔的粉身碎骨。

导航

归并排序

一.实现

1)第一种写法:

#include<iostream.h>
#include<stdlib.h>
#include<time.h>
#define LENGTH 15

void Merge(int a[],int left,int right,int rightend)
{
	int leftend=right-1;
	int n1=leftend-left+1;
	int n2=rightend-right+1;

	int *tempArrayA=(int*)malloc(sizeof(int)*n1);
	int *tempArrayB=(int*)malloc(sizeof(int)*n2);
	
	for(int i=0;i<n1;i++)
		tempArrayA[i]=a[left+i];
	for(i=0;i<n2;i++)
		tempArrayB[i]=a[right+i];

	int alongA=0;
	int alongB=0;

	for(i=0;alongA<n1&&alongB<n2;i++)
	{
		if(tempArrayA[alongA]<tempArrayB[alongB])
		{
			a[left+i]=tempArrayA[alongA];
			alongA++;
		}
		else
		{
			a[left+i]=tempArrayB[alongB];
			alongB++;
		}
	}

	while(alongA<n1)
	{
		a[left+i]=tempArrayA[alongA];
		i++;
		alongA++;
	}

	while(alongB<n2)
	{
		a[left+i]=tempArrayB[alongB];
		i++;
		alongB++;
	}

	free(tempArrayA);
	free(tempArrayB);
}


void MSort(int *a,int left,int right)
{
	int center;
	if(left<right)
	{
		center=(left+right)/2;
		MSort(a,left,center);
		MSort(a,center+1,right);
		Merge(a,left,center+1,right);
	}
}

void MergeSort(int *a,int n)
{
	MSort(a,0,n-1);
}

void DisPlay(int a[],int n)
{
	for(int i=0;i<n;i++)
		cout<<a[i]<<" ";
	cout<<endl;
}


void main()
{
	int array[LENGTH];
	srand( (unsigned)time( NULL ) );
	int TestNum=rand()%20+1;

	for(int i=0;i<TestNum;i++)
	{
		cout<<"========第"<<i+1<<"组测试用例=========="<<endl;
		for(int j=0;j<LENGTH;j++)
			array[j]=rand()%100;
		cout<<"排序前:";
		for(int k=0;k<LENGTH;k++)
			cout<<array[k]<<" ";
		cout<<endl;

		MergeSort(array,LENGTH);

		cout<<"排序后:";
		for(k=0;k<LENGTH;k++)
			cout<<array[k]<<" ";
		cout<<endl<<endl;
	}	
}

2)第二种写法:

#include<iostream.h>
#include<stdlib.h>
#include<time.h>
#define LENGTH 15

void Merge(int a[],int TempArray[],int Lpos,int Rpos,int RightEnd)
{
	int i,LeftEnd,NumElements,TempPos;
	LeftEnd=Rpos-1;
	TempPos=Lpos;
	NumElements=RightEnd-Lpos+1;

	while(Lpos<=LeftEnd&&Rpos<=RightEnd)
		if(a[Lpos]<=a[Rpos])
			TempArray[TempPos++]=a[Lpos++];
		else
			TempArray[TempPos++]=a[Rpos++];

	while(Lpos<=LeftEnd)
		TempArray[TempPos++]=a[Lpos++];

	while(Rpos<=RightEnd)
		TempArray[TempPos++]=a[Rpos++];

	for(i=0;i<NumElements;i++,RightEnd--)
		a[RightEnd]=TempArray[RightEnd];
}
void MSort(int a[],int TempArray[],int left,int right)
{
	int center;
	
	if(left<right)
	{
		center=(left+right)/2;
		MSort(a,TempArray,left,center);
		MSort(a,TempArray,center+1,right);
		Merge(a,TempArray,left,center+1,right);
	}
}

void MergeSort(int a[],int n)
{
	int *TempArray;
	TempArray=(int*)malloc(n*sizeof(int));
	if(TempArray!=NULL)
	{
		MSort(a,TempArray,0,n-1);
		free(TempArray);
	}
	else
		cout<<"No space for tmp array!!!";

}

void main()
{
	int array[LENGTH];
	srand( (unsigned)time( NULL ) );
	int TestNum=rand()%20+1;

	for(int i=0;i<TestNum;i++)
	{
		cout<<"========第"<<i+1<<"组测试用例=========="<<endl;
		for(int j=0;j<LENGTH;j++)
			array[j]=rand()%100;
		cout<<"排序前:";
		for(int k=0;k<LENGTH;k++)
			cout<<array[k]<<" ";
		cout<<endl;

		MergeSort(array,LENGTH);

		cout<<"排序后:";
		for(k=0;k<LENGTH;k++)
			cout<<array[k]<<" ";
		cout<<endl<<endl;
	}	
}

 

 

posted on 2011-11-09 19:42  鹰之歌  阅读(199)  评论(0编辑  收藏  举报