#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;
}
c/c++之模板方法实现归并排序
最新推荐文章于 2022-04-23 09:01:30 发布