一.实验内容
①顺序查找算法与二分查找算法比较。
a.定义两个函数分别实现顺序查找和二分查找算法。
b.主函数中用产生随机数的方式随机产生待查数据,通过调用口面编写函数查找指定的数据。
c.测试数据分别选择:在1000 10000 1000001000000个数中查找指定数据,对比两个函数的运行时间。
d. 得出结论这两个算法哪个效率高。
②朴素算法与分治算法计算x的n次方的算法比较。
a.定义两个函数实现计算x的n次方的朴素算法和分治算法。
b.输入x和n的值,调用这两个函数计算x的n次方的结果并求这两个函数的运行时间。
c.得出结论这两种算法哪个效率更高。
二.实验代码
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<dos.h>
#include<conio.h>
int main()
{
int n,key;//n为数组的个数,key是要查找的关键字
int s[100000];//定义随机查找数组
int t1,t2,t3,t4;//分别对应几个函数所用的操作时间
int i,j,m;
int x,y;//x为幂y为指数
int Search_seq(int a[],int b,int c);//顺序查找
int Search_bin(int a[],int b,int c);//折半查找
int recur_1(int a,int b);//分治算法
int simple_2(int a,int b);//朴素算法
printf("输入产生随机数个数:");
scanf("%d",&n);
srand(time(NULL));
for(i=1;i<=n;i++)//产生随机数组
{
s[i]=rand()%100000+1;
}
for(i=2;i<=n;i++)//利用直接排序法对随机数组进行排序
{
m=s[i];
j=i-1;
while(j>0&&s[j]>m)
{
s[j+1]=s[j];
s[j]=m;
j--;
}
}
for(i=1;i<=n;i++)//输出所产生的有序的数组
{
printf("%d ",s[i]);
}
printf("\n");//从以产生的有序的数组中寻找一个关键字
printf("输入要查找的关键字:");
scanf("%d",&key);
printf("进行顺序查找所循环的次数:");
t1=Search_seq(s,n,key);
printf("%d\n",t1);
printf("进行折半查找所循环的次数:");
t2=Search_bin(s,n,key);
printf("%d\n",t2);
printf("\n\n\n");//换行用
printf("输入x的值:");
scanf("%d",&x);
printf("输入幂y的值:");
scanf("%d",&y);
printf("用分治计算函数运行时间:");
t3=recur_1(x,y);
printf("%d\n",t3);
printf("用朴素计算函数运行时间:");
t4=simple_2(x,y);
printf("%d\n",t4);
return 0;
}
int Search_seq(int a[],int b,int c)//计算顺序查找查找时间
{
int i=1;
int num1=0;
while(i<=b)//循环顺序查找
{
if(a[i]==c) break;
else
i++;
num1++;
}
return num1;//返回顺序查找所循环的次数
}
int Search_bin(int a[],int b,int c)//计算折半查找所需时间
{
int low,high,mid;
int num2=0;
low=1;high=b;
while(low<=high)//对已有数组进行折半查找
{
mid=(low+high)/2;
if(mid==c) break;
if(low<c&&c<mid)
{high=mid-1;}
else
{low=mid+1;}
num2++;
}
return num2;//返回查找所循环的次数
}
int simple_2(int a,int b)//朴素算法函数
{
int i=1;
int num=1;
clock_t start,end;//时间函数
start=clock();
while(i<=b)
{
num=a*num;
i++;
}
end=clock();
return difftime(end,start);//返回朴素算法所需要的时间
}
int recur_1(int a,int b)//分治算法函数
{
int num,m,s;
clock_t start,end;//定义时间函数
start=clock();
if(b==1)
num=a;
if(b>1)
{
m=b/2;
s=recur_1(a,m);//利用递归循环
if(b%2==0)
{
num=s*s;
}
else
{
num=a*s*s;
}
}
end=clock();
return difftime(end,start);//返回分治所需要的时间
}
三.实验结果
折半查找比顺序查找效率更高,分治递归算法比朴素算法效率更高。使用合理的排序算法,能够极大的提高程序的运行效率,节约时间。