您的位置:首页 > 编程语言 > C语言/C++

c/c++之模板方法实现归并排序

2015-11-10 17:33 537 查看
#include <cstdio>
#include <cstring>
#include <cstdlib>

template <class T>
void Merge(T sourceArr[],T tempArr[],int startIndex,int midIndex,int endIndex){

int i = startIndex,j=midIndex+1,k = startIndex;

while(i!=midIndex+1 && j!=endIndex+1){

if(sourceArr[i]>sourceArr[j])
tempArr[k++] = sourceArr[i++];

else
tempArr[k++] = sourceArr[j++];
}

while(i!=midIndex+1)
tempArr[k++] = sourceArr[i++];

while(j!=endIndex+1)
tempArr[k++] = sourceArr[j++];

for(i=startIndex;i<=endIndex;i++)
sourceArr[i] = tempArr[i];

return ;
}

//内部使用递归
template <class T>
void MergeSort(T sourceArr[],T tempArr[],int startIndex,int endIndex){

int midIndex;

if(startIndex<endIndex){

midIndex=(startIndex+endIndex)/2;
MergeSort(sourceArr,tempArr,startIndex,midIndex);
MergeSort(sourceArr,tempArr,midIndex+1,endIndex);
Merge(sourceArr,tempArr,startIndex,midIndex,endIndex);
}

return ;
}
#define LEN(arr) sizeof(arr)/sizeof(arr[0])

template <class T>
void Reverse(T a[],int len,T* &b)
{
int count=len;
while(len--)
{
b[len]=a[count-len-1];
};
}
template <class T>
void printArray(T a[],int len)
{
int i=0;
for(i=0;i<len;i++)
printf("%d ",a[i]);
printf("\n");
}
//c/c++之模板方法实现归并排序
int main(int argc,char * argv[]){

//int a[]={50,10,20,30,70,40,80,60};

int count=0;
scanf("%d",&count);
while(count--)
{
int len;
scanf("%d",&len);
int *a=new int[len];
for(int i=0;i<len;i++)
{
scanf("%d",&a[i]);
}
int *b=(int*)malloc(sizeof(int)*len);
memset(b,0,len);
MergeSort(a,b,0,len);
printArray(a,len);
Reverse(a,len,b);
printArray(b,len);
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: