#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;
}
mergeSort
最新推荐文章于 2020-05-09 13:55:04 发布