归并排序

/*=============================================================================
#
#	   分治为子序列
#          归并排序
#	
#
=============================================================================*/
#include <stdio.h>
#include <time.h>
#include <malloc.h>

	int arr[]={6, 3, 5, 7, 2, 4, 1, 8, 10, 9};


//把数组合并
void merg_array(int *a1,int len1,int *a2,int len2)
{
	int i=0,j=0,k=0;
	int *arr_temp=(int *)malloc(sizeof(int)*(len1+len2));

	while(i<len1&&j<len2)
		arr_temp[k++]=a1[i]<a2[j]? a1[i++]:a2[j++];
	
	//a2已经为空,把a1中剩余的数搬到arr_temp中去就可以了
	while(i<len1)
		arr_temp[k++]=a1[i++];
	
	while(j<len2)
		arr_temp[k++]=a2[j++];
	
	for(i=0,k=0;i<len1+len2;++i,++k)
		a1[i]=arr_temp[k];
	
	free(arr_temp);
}

//
void merg_sort(int *a,int len)
{
	//结束条件
	if(len<=1)
		return;
	int *a1,*a2,len1,len2;
	len1=len/2;	len2=len-len1;	a1=a;	a2=a+len1;
	
	//分治调用
	merg_sort(a1,len1);
	merg_sort(a2,len2);
	
	//分治结束,合并两个子数组
	merg_array(a1,len1,a2,len2);

}

int main()
{

	int len=sizeof(arr)/sizeof(arr[0]);
	merg_sort(arr,len);
	for(int i=0;i<len;++i)
		printf("%d ",arr[i]);
	return 0;
}

posted @ 2014-06-18 16:30  StevenSuo  阅读(125)  评论(0编辑  收藏  举报