mergeSort

#include<iostream>
using namespace std;
template <class T>void merge(T *a,int left,int mid,int right)
{
	int n1=mid-left+1;
	int n2=right-mid;
	T *L = new T[n1];
	T *R = new T[n2];
	for(int i=0;i<n1;++i)
		L[i] = a[left+i-1];
	for(int i=0;i<n2;++i)
		R[i] = a[mid+i];
	int m=0;
	int n=0;
	for(int k=left-1;k<right;++k)
	{
		if(m<n1 && n<n2)
		{
			if(L[m]<=R[n])
			{
				a[k] = L[m];
				++m;
			}
			else
			{
				a[k] = R[n];
				++n;
			}
		}
		else if(m>=n1 && n<n2)
		{
			a[k] = R[n];
			++n;
		}
		else
		{
			a[k] = L[m];
			++m;
		}			
	}
	delete []L;
	delete []R;
}
//template <class T>void merge(T *a,int left,int mid,int right)
//{
//	int n1=mid-left+1;
//	int n2=right-mid;
//	T *L = new T[n1+1];
//	T *R = new T[n2+1];
//	for(int i=0;i<n1;++i)
//		L[i] = a[left+i-1];
//	for(int i=0;i<n2;++i)
//		R[i] = a[mid+i];
//	L[n1] = 65535;    //为避免在每个基本步骤必须检查是否有堆为空,在每个堆的底部放置一个哨兵牌,
//	R[n2] = 65535;   //其包含一个特殊的值,用于简化代码。这里使用最大值作为哨兵,它不可能为较小的牌,除非两个堆都已显露出其哨兵牌
//	int m=0;
//	int n=0;
//	for(int k=left-1;k<right;++k)
//	{
//		if(L[m]<=R[n])
//		{
//			a[k] = L[m];
//			++m;
//		}
//		else
//		{
//			a[k] = R[n];
//			++n;
//		}
//	}
//	delete []L;
//	delete []R;
//}
template<class T>void mergeSort(T *a,int left,int right)
{
	int q=0;
	if(left<right)
	{
		q=(left+right)/2;
		mergeSort(a,left,q);
		mergeSort(a,q+1,right);
		merge(a,left,q,right);
	}
}
template<class T>void print(T *a,int n)  
{  
    for(int i=0;i<n;++i)  
        cout<<a[i]<<ends;  
	cout<<endl;
}
int main()
{
	int a[] = {5,4,3,2,8,6,7,1};
//	char a[]="helloworld!";
	int num = sizeof(a)/sizeof(a[0]);
	mergeSort(a,1,num);
	print(a,num);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值