使用向量进行二分查找

4 c++ search vector

所以..我已经了解了二分搜索及其工作原理,甚至在没有用户任何输入的情况下尝试使用常量数组进行搜索,但现在我尝试应用向量而不是数组来让用户输入列表中的值从向量和要搜索的目标中搜索数字。这里我在使用数组时使用了普通的分而治之

using namespace std;
int Binary_search(int x[],int size,int target){
    int maximum= size-1;
    int minimum = 0;
    int mean;
    while (maximum>minimum){
        mean = (maximum+minimum)/2;
        if (x[mean] == target){
            cout << "The number you're looking for is found! \n";
            return mean;
        }
        else if(x[mean] > target){
            maximum = (mean-1);
        }
        else{
            minimum = (mean+1);
        }
    }
    return -1;
}
int main(){
    int x[]={1,2,3,4,5};
    int a=sizeof(x)/sizeof(x[0]);
    int target=4;
    int show=Binary_search(x,a,target);
    if (show != -1){
        cout << "Your result is in the index: " << show;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,我使用向量做了几乎相同的方法,但它显示了无限量的 **Your result is found at the index: ** (number of false index) 。或者根本不显示任何结果,甚至显示未找到结果,每次都以某种方式有所不同。这是使用向量时的情况

#include <iostream>
#include <vector>
using namespace std;
int Binary_search(vector<int>x,int target){
    int maximum=(x.size())-1;
    int minimum = 0;
    int mean;
    while (maximum>minimum){
        mean = (maximum+minimum)/2;
        if (x[mean] == target){
            cout << "The number you're looking for is found! \n";
        }
        else if(x[mean] > target){
            maximum = (mean-1);
        }
        else{
            minimum = (mean+1);
        }
    }
    return -1;
}
int main(){
    unsigned int i;
    int n;
    vector<int>x;
    cout << "Enter the amount of numbers you want to evaluate: ";
    cin >> i;
    cout << "Enter your numbers to be evaluated: " << endl;
    while (x.size() < i && cin >> n){
        x.push_back(n);
    }
    int target;
    cout << "Enter the target you want to search for in the selected array \n";
    cin >> target;
    int show = Binary_search(x,target);
    if (show == -1){
        cout << "Your result is not found ! ";
    }
    else{
        cout << "Your result is in the index: " << show;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

所以我认为问题出在这一部分int maximum=(x.size())-1;,也许是关于如何使用向量的大小?有人可以告诉我这个吗

Res*_*awi 8

好吧,其他答案已经帮助解决了这个问题,但如果您不知道,您可以使用用于执行二分搜索C++的内置函数。

我列出二分查找相关的函数

  • sort:只能对已排序的数据使用二分搜索,因此在搜索之前必须保证数据已排序。
  • lower_bound:此函数返回一个迭代器,指向大于或等于value 的第一个元素。
  • upper_bound:此函数返回一个迭代器,指向大于value的第一个元素。
  • binary_search :: 此函数返回一个boolean,无论是否找到该值(与您的程序完全相同)。

这是演示前面功能的代码示例:

#include <iostream>
#include <vector>
#include <algorithm>
#include <iostream>

typedef std::vector<int>::iterator iter;

int main() {

    std::vector<int> vec = {10, 20, 30, 30, 20, 10, 10, 20};

    // sort the data
    // the data will be:
    // 10, 10, 10, 20, 20, 20, 30, 30
    std::sort(vec.begin(), vec.end());

    // index of the first element, greater than or equal to 20
    iter low = std::lower_bound(vec.begin(), vec.end(), 20);

    // index of the first element, greater than 20
    iter high = std::upper_bound(vec.begin(), vec.end(), 20);

    std::cout << "index of first element, greater than or equal to 20 is: " << (low - vec.begin()) << '\n';

    std::cout << "index of first element, greater than to 20 is: " << (high - vec.begin()) << '\n';

    // classic binary search
    // check whether a givin value exists in the array or not
    if (std::binary_search(vec.begin(), vec.end(), 99)) {
        std::cout << "Found\n";
    } else {
        std::cout << "Not found\n";
    }

}
Run Code Online (Sandbox Code Playgroud)