Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关于二进制搜索函数的问题_C++_Arrays_Algorithm_Search_Binary Search - Fatal编程技术网

C++ 关于二进制搜索函数的问题

C++ 关于二进制搜索函数的问题,c++,arrays,algorithm,search,binary-search,C++,Arrays,Algorithm,Search,Binary Search,顶部列出的二进制搜索函数有问题。我不知道该去哪里。我不太熟悉二进制搜索 #include <iostream> #include <cstdlib> #include <fstream> using namespace std; void get_input(ifstream& fin, int a[], int size, int & array_size); void binary_search (int a[], int &

顶部列出的二进制搜索函数有问题。我不知道该去哪里。我不太熟悉二进制搜索

#include <iostream>
#include <cstdlib>
#include <fstream>

using namespace std;

void get_input(ifstream& fin, int a[], int size, int & array_size);

void binary_search (int a[], int & array_size)
{
    cout << "Please enter the element you would like to search for \n";
    int element;
    cin >> element;

    int lastindex=array_size-1, startindex=0;

    while (startindex <= lastindex)
    {
        int midindex=(array_size/2);
        if(element > a[midindex])
        {
            startindex=midindex;
        }
        else if (element < a[midindex])
        {
            lastindex=midindex-1;
        }

    }

}

int main()
{
    int array_size=-1;
    int a[100];

    ifstream fin;

    get_input (fin, a, 100, array_size);

    binary_search (a, array_size);

    return 0;
}

void get_input (ifstream& fin, int a[], int size, int & array_size)
{
    fin.open("numbers.txt");
    if (fin.fail())
    {
        cout << "File failed to open";
        exit(1);
    }


    for(int i = 0; i < size; i++)
    {
        a[i] = 0;
    }

    cout << "The numbers in the array are: \n\n";

    for (int i = 0; i < size; i++)
    {
        if (!fin.eof())
        {
            fin >> a[i];
            array_size ++;
        }
    }

    for (int i = 0; i < array_size; i++)
    {
            cout << a[i] << "  ";
    }

    cout << "\n\n\n";
    cout << "The numbers in the array sorted are: \n\n";

   for(int i = 0; i < array_size; ++i )
   {
        int temp2 = a[i];

        for (int j = i+1; j < array_size; ++j )
        {

            if( a[j] < temp2)
            {
                temp2 = a[j];

                int temp = a[i];
                a[i]    = a[j];
                a[j]    = temp;
            }
        }
    }





    for (int i = 0; i < array_size; i++)
    {
            cout << a[i] << "  ";
    }

    cout << "\n\n\n";

    fin.close();
}
#包括
#包括
#包括
使用名称空间std;
void get_输入(ifstream&fin,int a[],int size,int&array_size);
无效二进制搜索(int a[],int和数组大小)
{
cout>元素;
int lastindex=array_size-1,startindex=0;
while(startindex a[midindex])
{
startindex=midindex;
}
else if(元素
startindex=midindex;
致:

最重要的是,当你找到元素时,你什么也没做

if(element == a[midindex]) {
  cout<<"Element "<<element<<" found at index "<<midindex<<endl;
  return;
}
if(元素==a[midindex]){
不能试着改变

startindex=midindex;
致:

最重要的是,当你找到元素时,你什么也没做

if(element == a[midindex]) {
  cout<<"Element "<<element<<" found at index "<<midindex<<endl;
  return;
}
if(元素==a[midindex]){

我的第一反应是换线

另外,是否要报告是否找到了所查找的元素?要在找到元素时检测情况,请执行另一个
if
分支,如下所示

if( element == a[midindex] )
可以插入。它可以有一个
返回元素;
返回midindex
在它内部,同时有一个
返回失败;
在循环外部


编辑:我无意中尝试编写了一个二进制搜索版本。我并不声称它是正确的,因为二进制搜索以出错而闻名。上传到代码板

片段:

int *
mybsearch( int const *  const a, size_t const n, int const key ) {

    int * lo = const_cast< int * >( a );
    int * hi = lo + n;

    while( lo <= hi ) {

        int * const mid = lo + (hi - lo) / 2;
        int const midelem = *mid;

        if( key == midelem ) {
            return mid;
        }
        else if( key < midelem ) {
            hi = mid - 1;
        }
        else {
            lo = mid + 1;
        }
    }

    return NULL;
}

我的第一反应是改变路线

另外,是否要报告是否找到了所查找的元素?要在找到元素时检测情况,请执行另一个
if
分支,如下所示

if( element == a[midindex] )
可以插入。它可以有一个
返回元素;
返回midindex
在它内部,同时有一个
返回失败;
在循环外部


编辑:我无意中尝试编写了一个二进制搜索版本。我并不声称它是正确的,因为二进制搜索以出错而闻名。上传到代码板

片段:

int *
mybsearch( int const *  const a, size_t const n, int const key ) {

    int * lo = const_cast< int * >( a );
    int * hi = lo + n;

    while( lo <= hi ) {

        int * const mid = lo + (hi - lo) / 2;
        int const midelem = *mid;

        if( key == midelem ) {
            return mid;
        }
        else if( key < midelem ) {
            hi = mid - 1;
        }
        else {
            lo = mid + 1;
        }
    }

    return NULL;
}

二进制搜索可以很好地作为递归算法工作。传入数组和长度,检查中间值,然后根据需要在数组的上/下半部分递归。

二进制搜索可以很好地作为递归算法工作。传入数组和长度,检查中间值,然后在数组的上/下半部分递归,作为递归算法适当。

当数组大小=1时,仔细考虑int-midindex=(数组大小/2)
的不正确之处。然后推广到数组大小=3。然后推广到任意奇数。这需要在你的头脑中或纸上进行小规模的模拟。

仔细考虑int-midindex=(数组大小/2)的不正确之处
当array_size=1时。然后推广到array_size=3。然后推广到任意奇数。这需要在你的头脑或纸上进行小规模的模拟。

你很接近了。你想这样做:

int binary_search ...
因此可以返回元素的索引

while (startindex < lastindex)    
{
    int midindex=(startindex+endindex)/2;
    if(element = a[midindex]) {
        return midindex;
    }
    else if(element > a[midindex])
    {
        startindex=midindex+1;
while(startindexa[midindex])
{
startindex=midindex+1;

很接近了。您要执行以下操作:

int binary_search ...
因此可以返回元素的索引

while (startindex < lastindex)    
{
    int midindex=(startindex+endindex)/2;
    if(element = a[midindex]) {
        return midindex;
    }
    else if(element > a[midindex])
    {
        startindex=midindex+1;
while(startindexa[midindex])
{
startindex=midindex+1;


是的,当我看到你的答案是
startindex=midindex+1时,我投了反对票,现在已修复:)这非常有效,只是我没有得到正确的midindex。如果元素在数组中,你应该得到正确的索引。你的元素在数组中吗?是的,输出数字是1、6、7、11、19、21……等等。和当我搜索11时,我没有得到正确的索引。还要注意,索引从
0
开始,而不是从
1
开始。如果您想要人类风格索引(从1开始)在显示其值之前,您应该将
1
添加到
midindex
中。是的,当我看到您的答案是
startindex=midindex+1时,我投了反对票,现已修复:)除了我没有返回正确的midindex之外,这一切都很好。如果数组中存在该元素,您应该获得正确的索引。您的元素是否存在在数组中?是的,输出数字是1、6、7、11、19、21……等等。当我搜索11时,我没有得到正确的索引。还要注意索引从
0开始,而不是从
1开始。如果你想要人类风格索引(从1开始)在显示其值之前,您应该将
1
添加到
midindex
中。如何使用它?首先,您应该将i/o从搜索函数中分离出来,并将要搜索的元素作为参数传递到函数中。为什么不使用
std::vector
std::swap
等?GMan不能手动对其进行编码。或者会的。@GMan——可能和他不使用std::binary\u搜索(家庭作业)的原因相同@亚历克:你一直说你得到了错误的索引。你能给我们看一下你的测试数据和程序的输出吗,这样我们就可以帮助而不是猜测了?去哪里?首先,你应该把i/o从搜索函数中分离出来,把要搜索的元素作为参数传递到函数中
while (startindex < lastindex)    
{
    int midindex=(startindex+endindex)/2;
    if(element = a[midindex]) {
        return midindex;
    }
    else if(element > a[midindex])
    {
        startindex=midindex+1;