【数据结构】搜索算法效率比较

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1

数据结构课程设计

算法分析:搜索算法效率比较

专业 Xxxx

学生姓名 xxxx

班级 xxxxx

号 xxxxxxxxxxx

目录

1 设计题目 (1)

2 设计分析 (2)

3 设计实现 (3)

4测试方法 (6)

5测试结果 (7)

6 设计小结 (7)

1.设计题目

给定一个已排序的由N个整数组成的数列{0,1,2,3,……,N-1},在该队列中查找指定整数,并观察不同算法的运行时间。

考虑两类算法:一个是线性搜索,从某个方向依次扫描数列中各个元素;另一个是二叉搜索法。

要完成的任务是:

分别用递归和非递归实现线性搜索;

分析最坏情况下,两个线性搜索算法和二叉搜索算法的复杂度;

测量并比较这三个方法在N=100,500,1000,2000,4000,6000,8000,10000时的性能。

3

2.设计分析

5

在实际测试中,当程序运行时间太快,会无法获得实际运行时间。为了避免这种情

况,可以将同一操作运行K 遍,得到1秒以上的时间,再将结果除以重复次数K 得到平均时间。若单重循环还不能达到目的,可用多重嵌套循环解决。

3 设计实现

#include

#include

clock_t start, stop; /* clock_t 是内置数据类型,用于计时 */

double duration; /* 记录函数运行时间,以秒为单位*/

/***********非递归线性搜索x ***********/

int IterativeSequentialSearch(const int a[],int x,int n)

{

int i;

for(i=0;i

if(a[i]==x) /* 找到x */

return i;

return -1; /* 未找到x */

/*********** 递归线性搜索x ***********/

int RecursiveSequentialSearch(const int a[],int x,int n)

{

if(n==0)

return -1; /* 未找到x */

if(a[n-1]==x) /* 找到x */

return n-1;

return RecursiveSequentialSearch(a,x,n-1); /* 继续递归线性搜索*/ }

/***********二叉搜索x ***********/

int BinarySearch(const int a[],int x,int n)

{

int low,mid,high; /*数组的左右边界*/

low=0;high=n-1;

while(low<=high)

{

mid=(low+high)/2; /*计算居中元素*/

if(a[mid]

low=mid+1; /*改变左边界*/

else if(a[mid]>x) /*比居中元素小*/

high=mid-1; /*改变右边界*/

else return mid; /*找到x */

}

return -1; /* 未找到x */

}

int main ( )

/* clock() 返回函数运行时间*/

int i,n,x,a[10000];

long k,l;

printf("Please enter n:\n");

scanf("%d",&n); /* 输入数据*/

if(n<100||n>10000) /*处理异常输入*/

{

printf("error!");

return -1;

}

x=n; /* 指定要查找的数*/

for(i=0;i

a[i]=i;

printf("Please enter iterations:\n"); /*为了更准确地计算运行时间,我们可以重复多次调用算法,再取平均值*/

scanf("%ld",&k);

if(k<1) /*处理异常输入*/

{

printf("error!");

return -1;

}

/*********** 非递归线性搜索***********/

start = clock(); /* 记录函数的开始时间*/

for(l=0;l

IterativeSequentialSearch(a,x,n);

stop = clock(); /*记录函数的结束时间*/

duration = ((double)(stop - start))/CLK_TCK; /*计算函数运行时间*/

printf("\nIterativeSequentialSearch:\nIterations:%ld\nTicks:%d\nTotal Time:%.8lf\nDuration:%.8lf\n",k,(int)(stop-start),duration,duration/k);/*输出花费时间*/

/*********** 递归线性搜索***********/

7

相关文档
最新文档