排序—归并排序(简单优化前后比较)

作者 : admin 本文共1485个字,预计阅读时间需要4分钟 发布时间: 2024-06-8 共1人阅读

前言

个人小记


一、优化方案

将递归调用中的创建数组空间提出,减少数组空间创造次数,从而减少运行时间。

二、代码

#include 
#include 
#include 
#include 
#define MAX_ARR 100000
#define swap(a,b)\
{\
__typeof(a) __c=a;\
a=b,b=__c;\
}
#define TEST(func,arr,l,r)\
{\
printf("test:%s	",#func);\
int n=r-l;\
int* t=(int*)malloc(sizeof(int)*n);\
memcpy(t,arr,sizeof(int)*n);\
long long a=clock();\
func(t,l,r);\
long long b=clock();\
if(check(t,n))printf("OK %lldms
",(b-a)*1000/CLOCKS_PER_SEC);\
else printf("FAIL");\
free(t);\
}
int check(int* t,int n)
{
for(int i=1;i<n;i++)
{
if(t[i-1]>t[i])return 0;
}
return 1;
}
int* init_arr(int n)
{
int* arr=(int*)malloc(sizeof(int)*n);
for(int i=0;i<n;i++)arr[i]=rand()%100000;
return arr;
}
int *buff;
void OP_merger_sort(int *arr,int l,int r)
{
if(r-l<=1) return ;
int mid=(r+l)/2;
int p1=l,p2=mid;
OP_merger_sort(arr,l,mid);
OP_merger_sort(arr,mid,r);
int i=0;
while(p1<mid||p2<r)
{
if(p2==r||(p1<mid&&arr[p1]<arr[p2]))
{
buff[i++]=arr[p1++];
}
else buff[i++]=arr[p2++];
}
for(int i=l;i<r;i++)arr[i]=buff[i-l];
return ;
}
void merger_sort(int *arr,int l,int r)
{
if(r-l<=1) return ;
int mid=(r+l)/2;
int p1=l,p2=mid;
int* temp=(int *)malloc(sizeof(int)*(r-l));
merger_sort(arr,l,mid);
merger_sort(arr,mid,r);
int i=0;
while(p1<mid||p2<r)
{
if(p2==r||(p1<mid&&arr[p1]<arr[p2]))
{
temp[i++]=arr[p1++];
}
else temp[i++]=arr[p2++];
}
for(int i=l;i<r;i++)arr[i]=temp[i-l];
free(temp);
return ;
}
int main()
{
srand((unsigned)time(0));
int *arr=init_arr(MAX_ARR);
buff=(int *)malloc(sizeof(int)*MAX_ARR);
TEST(merger_sort,arr,0,MAX_ARR);
TEST(OP_merger_sort,arr,0,MAX_ARR);
free(arr);
free(buff);
return 0;
}

二、测试结果

test:merger_sort        OK 18ms
test:OP_merger_sort     OK 16ms
本站无任何商业行为
个人在线分享 » 排序—归并排序(简单优化前后比较)
E-->