二分搜索优化

时间:2021-06-14 07:36:14

标签: c++ arrays algorithm search

我用两种方式实现了二分查找,想知道哪种更有效?请帮助我知道哪个更有效以及如何进一步优化?两种方法的时间复杂度是否保持不变?我是编程初学者。

方法一;

#include<iostream>
using namespace std;
bool BinarySearch(int*a,int n,int s ){
    if(n==1){
        if(a[0]==s)
            return true;
        else
            return false;
    }
    else{
        if(s<a[n/2]){
            int U[n/2];
            for(int i=0;i<n/2;i++){
                U[i]=a[i];
            }
            return BinarySearch(U,n/2,s);
        }
        else{
            int V[n-n/2];
            for(int i=0;i<n-n/2;i++){
                V[i]=a[i+n/2];
            }
            return BinarySearch(V,n-n/2,s);
        }

    }
}
int main(){
int array[10]={2,4,6,8,10,12,14,16,18,22};
cout<<BinarySearch(array,10,9);
}

方法二:

#include<iostream>
using namespace std;
    bool Bsearch(int arr[],int s,int l,int x){
        cout<<"calling bsearch with arguments "<<s<<' '<<l<<' '<<x<<endl;
        if(l==1)
            return arr[s]==x;
        int h=l/2;
        if(x<arr[s+h])
            return Bsearch(arr,s,h,x);
        else
            return Bsearch(arr,s+h,l-h,x);
    }
int main(){
    int marks[11]={17,18,20,22,24,26,28,30,32,34,36};
    cout<<Bsearch(marks,0,11,32);
}

在此先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

其他海报是正确的,可变长度数组不是好的 C++。如果您将 main() 定义为:

int main() {
    std::array<int> marks{17,18,20,22,24,26,28,30,32,34,36};
    cout<<Bsearch(marks,0,32);
}

或:

int main() {
    std::vector<int> marks{17,18,20,22,24,26,28,30,32,34,36};
    cout<<Bsearch(marks,0,32);
}

然后您可以将参数列表中的指针/长度对放到您的二进制搜索函数中。函数原型变成了这样:

bool Bsearch(const std::array<int>& arr, int s, int x);
相关问题