* author : Deng yong
 * date:2016 2 24
 * filename : 归并排序
 */
#include <iostream>
template<typename T>
void merget( T A[], int p, int q, int r)
{
	int n_1=q-p+1; //已经排序好的数组p->q的长度
	int  n_2=r-q; //已经排序好的数组q->r的长度
	
	T  L[n_1];//p->q
	T  R[n_2];//q+1->r
	
	std::cout<<"L"<<std::endl;
	
	for ( int  i=0; i<n_1;i++)
	{
		L[i]=A[p+i];
		std::cout<<L[i]<<"		";
	}
	//test 
	std::cout<<std::endl;
	std::cout<<"R"<<std::endl;
	for ( int i=0; i<n_2;i++)
	{
		R[i]=A[q+i+1];
		std::cout<<R[i]<<"	";
	}
	int i=0;
	int j=0;
	int k=p;
	std::cout<<std::endl;
	
	std::cout<<"start"<<std::endl;
	
	while (i<n_1&&j<n_2)
	
	{
		
		if (L[i]<R[j]) 
		{
			A[k]=L[i];
			i++;
		}
		else 
		{
			
			A[k]=R[j];
			j++;
		}
		
		std::cout<<"A"<<k<<"**"<<A[k]<<std::endl;
		k++;
	}
	
	
	
	
	while (i<n_1)
	{
		A[k++]=L[i++];
	}
	while (j<n_2)
	{
		A[k++]=R[j++];
	}
	
	
	
}
	 
#include <iostream>
	 
template <typename T>
void merge_sort(T A[], int  p, int r)
{
	if (p<r)
	{
		int q=(p+r)/2;
		merge_sort( A, p,q);
		merge_sort(A,q+1,r);
		merget(A,p,q,r);
	}
}
int main()
{
#ifdef test_merget
	int a[6]={0,5,7,2,4,8};
	merget(a,0,2,5);
	for (int i=0;i<6;i++)
	{
		std::cout<<a[i]<<std::endl;
	}
#else 
	int a[6]={0,6,2,9,4,5};
	
	merge_sort(a,0,5);
	for ( int i=0;i<6;i++)
	{
		std::cout<<a[i]<<std::endl;
	}
	
#endif
}
	
原文:http://www.cnblogs.com/caffe/p/5215114.html