检索算法
1. 问题
写出两种检索算法:在一个排好序的数组T[1..n]中查找x,如果x在T中,输出x在
T的下标j;如果x不在T中,输出j=0.
2. 解析
1、最暴力的方法就是,循环一遍整个数组,如果找到x,则输出下标,如果未找到就输出0.
2、注意到此为有序数组,所以可以用二分法查找,时间复杂度比暴力快。
3. 设计
1、暴力
For(int i=1;i<=n;i++){
If(T[i]==x)cout<<i<<”\n”;
}
if(未找到)cout<<0<<”\n”;
2、二分
int l=1,r=n;
while(l<=r){
int mid=(l+r)>>1;
if(T[mid]==x){
cout<<mid<<"\n";
return;//找到x,输出下标mid
}
if(T[mid]<x)l=mid+1;//不断二分,逼近x
else r=mid-1;
}
4. 分析
1、暴力算法,遍历整个数组,时间复杂度为O(n).
2、二分法,时间复杂度为O(logn).
5. 分析
1、暴力算法
/*
author: keke
project name:暴力查找算法
Time Complexity: O(n)
*/
#include<bits/stdc++.h>
using namespace std;
const int maxn=100;
int T[maxn],n,x;
void solve(int x){
for(int i=1;i<=n;i++){
if(T[i]==x){
cout<<i<<"\n";
return;//找到x,输出下标i
}
}
cout<<0<<"\n";//未找到,输出0
}
int main(){
cin>>n;//数组长度为n
for(int i=1;i<=n;i++)cin>>T[i];
cin>>x;//查找x的下标
solve(x);
return 0;
}
2、二分查找
/*
author: keke
project name:二分查找算法
Time Complexity: O(log(n))
*/
#include<bits/stdc++.h>
using namespace std;
const int maxn=100;
int T[maxn],n,x;
void solve(int x){
int l=1,r=n;
while(l<=r){
int mid=(l+r)>>1;
if(T[mid]==x){
cout<<mid<<"\n";
return;//找到x,输出下标mid
}
if(T[mid]<x)l=mid+1;//不断二分,逼近x
else r=mid-1;
}
cout<<0<<"\n";//未找到x,输出0
}
int main(){
cin>>n;//数组长度为n
for(int i=1;i<=n;i++)cin>>T[i];
cin>>x;//查找x的下标
solve(x);
return 0;
}

浙公网安备 33010602011771号