对于一维数组: int a[N];
在访问某个元素 a[i] 时,有一个寻址过程,其地址为:address=a+i。程序中 a[i]的形式越多,计算地址的次数就越多,越耗费时间。
用指针进行优化,一般都是针对 a[i] 形式的代码进行优化。
下标法的优点是:符合人们思维习惯,简洁易懂,代码可读性强,但效率低;
指针法的优点是:经过了人的努力优化,效率高,但代码可读性差。
因此,这世间基本就没有完美的事物,总是具有两面或者多面性。
下面,我们以冒泡排序为例,看一下用数组下标法编程和用指针法编程的效率对比。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//测试数据量为10000个
const int M=10000;
//数组a、b中数据一模一样
//下标法对a排序,指针法对b排序
int a[M],b[M];
void display(int a[],int M)
{//打印数组a中数据
int i;
for(i=0;i<M;i++)
printf("%d ",a[i]);
printf("\n");
}
void f0()
{//为数组a、b生成相同的随机数
int i;
for(i=0;i<M;i++)
a[i]=b[i]=rand();
}
void f1(int a[],int M)
{//数组下标法冒泡排序
int i,j,t,tt;
for(i=1;i<M;i++)
{
for(j=0;j<M-1;j++)
{
tt=j+1;
if(a[j]>a[tt])
{
t=a[j];a[j]=a[tt];a[tt]=t;
}
}
}
}
void f2(int *a,int M)
{//指针法冒泡排序
int *p,*q,*tt;
int i,t;
q=a+M-1;
for(i=1;i<M;i++,q--)
{
for(p=a;p<q;p++)
{
tt=p+1;
if(*p>*(tt))
{
t=*p;*p=*(tt);*(tt)=t;
}
}
}
}
int main()
{
f0();//生成随机数组a、b
clock_t t1,t2,t3,t4;
int count=5;
for(;count>0;count--)
{
f0();
t1=clock(); //数组下标法开始时间
f1(a,M);
t2=clock();//数组下标法结束时间
//display(a,M);
t3=clock();//指针法开始时间
f2(b,M);
t4=clock();//指针法结束时间
//display(b,M);
printf("%ld %d\n",t2-t1,t4-t3);
}
}
某次的运行结果如下:
从运行结果可以看出,第一列为数组下标法的5次运行时间,第二列为指针法的5次运行时间;
指针法要比数组下标法速度要快。
图中的时间单位是时钟频率,不是秒,似乎也不是毫秒。