实验报告
课程名称 《算法分析与设计》 实验日期 2021年 3月15日 至 2021年3月20日
学生姓名 王浩楠 所在班级 计算机195 学号 2019212212179
实验名称
实验地点 同组人员
1.问题
[描述算法问题,首选形式化方式(数学语言),其次才是非形式化方式(日常语言)]
写出两种检索算法:在一个排好序的数组T[1…n]中查找x,如果x在T中,输出x在T的下标j;如果x不在T中,输出j=0.
2.解析
[问题的理解和推导,可用电子版直接在此编写,也可用纸笔推导,拍照嵌入本文档]
1、顺序查找:顺序查找又叫线性查找,它的查找过程是:从表中第一个(或者最后一个)记录开始,逐个进行记录的关键字和给定值比较,若某个记录的关键字和给定值相等,者查找成功,找到所查的记录;如果直到最后一个(或者第一个)记录,其关键字和给定值比较都不等时,则表中没有所查的记录,查找不成功。
2、二分查找:二分查找也叫折半查找,它的查找过程是:将查找表中间位置数据元素的关键字与给定关键字比较,如果相等则查找成功;否则利用中间元素将表一分为二,如果中间关键字大于给定关键字,则在前一子表中进行折半查找,否则在后一子表中进行折半查找。重复以上过程直到找到满足条件的元素,则查找成功;或直到子表为空为止,此时查找不成功。
3.设计
[核心伪代码]
1、顺序查找
int Sequential_Search(int a[],int n,int key)
{
int i;
for(i=1;i<=n;i++)
{
if(a[i]==key)
return i;
}
return 0;
}
2、二分查找
int Binary_Search(int a[], int length, int key)
{
int low = 1;
int high = length;
int mid;
while (low <= high)
{
mid = (low+high)/2; //折半,mid为中间数据
if (key<a[mid])
high = mid-1; //最大下标变为现在mid下标前一位,继续查找
else if (key>a[mid])
low = mid+1; //最小下标变为现在mid下标后一位,继续查找
else
return mid; //相等即找到,返回mid
}
return 0;
}
4.分析
[算法复杂度推导]
1、顺序查找:O(n)
2、二分查找:O(log n)
5.源码
[github源码地址]
https://github.com/Wanghaonan520/algorithm