问题:
写出两种检索算法:在一个排好序的数组T[1…n]中查找x,如果x在T中,输出x在T的下标j;如果x不在T中,输出j=0.按实验模板编写,“分析”部分仅给出复杂度结果即可。
解析:
方法一:二分查找法
将x和数组中间值T[m]比较,若相等则查找成功,如果不相等则看x大于还是小于T[m],缩小范围,直到查找到下标j,或查找结束,得出x不在数组中,返回j=0。
方法二:顺序查找法
从数组的第一个数开始按顺序查找,将每一个数与x相比,如果相等输出下标j,如果到结尾了还没找到,则输出j=0;
设计:
#include<stdio.h>
#include<math.h>
int findx_1(int a[],int n,int x){//顺序查找
for(int i=0;i<n;i++){
if(a[i]==x)
return i;
}
return 0;
}
int findx_2(int a[],int n,int x){//二分查找
int head=1;
int tail=n;
int m;
while(head<=tail){
m=floor((head+tail)/2.0);
if(x<a[m])
tail-=1;
else if(x>a[m])
head+=1;
else
return m;
}
return 0;
}
int main(){
int a[100],n,x;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
scanf("%d",&x);
printf("%d\n",findx_2(a,n,x));
}
分析:
算法复杂度
方法1:二分查找:O(logn)
方法2:顺序查找:O(n)