自己写了一下,不知道是不是我写的太繁琐的原因,怎么写完之后觉得和之前的几个排序方法比起来,代码好长啊。怪了~~~~
#include<iostream>
using namespace std;
template <class T>
void Copy(T a[],T b[],int left,int right)
{
int size=right-left+1;
for(int i=0;i<size;i++)
{
a[left++]=b[i];
}
}
//合并有序数组a[left:i],a[i+1:right]到b,得到新的有序数组b
template <class T>
void Merge(T a[],T b[],int left,int i,int right)
{
//指向第一个数组开头
int a1cout=left,
//指向第一个数组结尾
a1end=i,
//指向第二个数组开头
a2cout=i+1,
//指向第二个数组结尾
a2end=right,
//指向b中的元素
bcout=0;
for(int j=0;j<right-left+1;j++)
{
//如果第一个数组结束,拷贝第二个数组的元素到b
if(a1cout>a1end)
{
b[bcout++]=a[a2cout++];
continue;
}
//如果第二个数组结束,拷贝第一个数组的元素到b
if(a2cout>a2end)
{
b[bcout++]=a[a1cout++];
continue;
}
//如果两个数组都没结束,比较元素大小,把较小的放入b
if(a[a1cout]<a[a2cout])
{
b[bcout++]=a[a1cout++];
continue;
}
else
{
b[bcout++]=a[a2cout++];
continue;
}
}
}
template <class T>
void MergeSort(T a[],int left,int right)
{
T *b=new int[right-left+1];
if(left<right)
{
//取中点
int i=(left+right)/2;
MergeSort(a,left,i);
MergeSort(a,i+1,right);
Merge(a,b,left,i,right);
Copy(a,b,left,right);
}
}
//测试
void main()
{
int arr[]={3,65,23,4,86,12,43,25,19,7};
int len=sizeof(arr)/sizeof(int);
MergeSort(arr,0,len-1);
for(int i=0;i<len;i++)
cout<<arr[i]<<endl;
}
还是请大家多多指教~~~