实验报告
课程名称 《算法分析与设计》 实验日期 2020年 3 月 22 日 至 2020 年 3 月 22 日
学生姓名 林泓佺 所在班级 计算机193 学号 20019212212088
实验名称 数组查询
实验地点 勤园13号楼208 同组人员 林泓佺
1.问题
[写出两种检索算法:在一个排好序的数组T[1…n]中查找x,如果x在T中,输出x在T的下标j;如果x不在T中,输出j=0]
2.解析
[
直接查询:从数组最前端开始查找,直到找到该数字为止,返回下标,若寻找不到,返回0;
二分查询:定义左边界与右边界,每次查询区间内中间的数,若找到则返回下标,若查询的位置比该数小,则左边界为中间值加1,否则有边界为中间值减1,直到左边界大于等于右边界为止,若查找不到,返回0;
]
3.设计
[#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
int a[maxn];
int n;
//直接查询
int check(int num[],int x) {
for(int i=1; i<=n; i++) {
if(num[i]==x)return i;
}
return 0;
}
//二分查找
int scheck(int num[],int x) {
int l=1,r=n;
while(l<r) {
int mid=(l+r)/2;
if(num[mid]==x)return mid;
else if(num[mid]<x) l=mid+1;
else r=mid-1;
}
if(num[l]!=x)l=0;
return l;
}
int main() {
int k;
cout<<“请输入数组长度:”<<endl;
cin>>n;
cout<<“请输入数组:”<<endl;
for(int i=1; i<=n; i++) {
cin>>a[i];
}
cout<<“请输入要查询的数字:”<<endl;
cin>>k;
cout<<"直接查询数组下标为: ";
cout<<check(a,k)<<endl;
cout<<"二分查询数组下标为: ";
cout<<scheck(a,k);
}
]
4.分析
[直接查询算法复杂度:O(n)
二分查找算法复杂度:O(log2n)]
5.源码
[github源码地址:https://github.com/lhqbalabala/3.22]