前言
个人小记
一、代码如下
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define MAX_COUNT 100000000
#define father(i) ((i)/2)
#define left(i) ((i)*2)
#define right(i) ((i)*2)+1
#define TEST(func,arr,n)\
{\
printf("%s:",#func);\
int *t=(int *)malloc(sizeof(int)*n);\
memcpy(t,arr,sizeof(int)*n);\
long long int a,b;\
a=clock();\
func(t,n);\
b=clock();\
if(check(t,n)) printf("OK\t%lldms\n",(b-a)*1000/CLOCKS_PER_SEC);\
else printf("FAUSE\n");\
free(t);\
}
void down_update(int *,int ,int);//不想换位置了,声明一下
int check(int *arr,int n)
{
for(int i=1;i<n;i++)
{
if(arr[i-1]>arr[i])return 0;
}
return 1;
}
void swap(int *a,int *b)
{
int t=*a;
*a=*b;
*b=t;
return ;
}
int * init_arr(int n)
{
int * arr=(int *)malloc(sizeof(int )*n);
for(int i=0;i<n;i++)arr[i]=rand()%10000;
return arr;
}
void up_update(int * data,int i)
{
while(i>1&&data[i]>data[father(i)])
{
swap(&(data[i]),&(data[father(i)]));
i=father(i);
}
return ;
}
void heapsort(int *data,int n)
{
for(int i=n;i>1;i--)
{
swap(&(data[1]),&(data[i]));
down_update(data,1,i-1);
}
return ;
}
void normal_build(int *data,int n)
{
for(int i=2;i<=n;i++)
{
up_update(data,i);
}
return ;
}
void normal(int *arr,int n)
{
int * data=arr-1;
normal_build(data,n);
heapsort(data,n);
return ;
}
void down_update(int *data,int i,int n)
{
while(left(i)<=n)
{
int max=i,l=left(i),r=right(i);
if(data[max]<data[l])max=l;
if(right(i)<=n&&data[max]<data[r])max=r;
if(max!=i)
{
swap(&(data[max]),&(data[i]));
i=max;
}
else break;
}
return ;
}
void linear_build(int *data,int n)
{
for(int i=n/2;i>0;i--)
{
down_update(data,i,n);
}
return ;
}
void linear(int *arr,int n)
{
int *data=arr-1;
linear_build(data,n);
heapsort(data,n);
return ;
}
int main()
{
srand((unsigned)time(0));
int *arr=init_arr(MAX_COUNT);
TEST(normal,arr,MAX_COUNT);
TEST(linear,arr,MAX_COUNT);
free(arr);
return 0;
}
二、输出结果
normal:OK 63597ms
linear:OK 62987ms