检索算法

1. 问题

  写出两种检索算法:在一个排好序的数组T[1..n]中查找x,如果xT中,输出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;
}

 

posted @ 2020-03-16 13:43  powerkeke  阅读(231)  评论(0)    收藏  举报