Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.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++_Algorithm_Binary Search - Fatal编程技术网

C++ 带“的二进制搜索”;中点;三分之一

C++ 带“的二进制搜索”;中点;三分之一,c++,algorithm,binary-search,C++,Algorithm,Binary Search,我想设计一个二进制搜索算法,使用递归将您要查找的项目与第33百分位和第66百分位的项目进行比较,而不是与中点进行比较 这就是我到目前为止所做的: #include <iostream> using namespace std; //binary search recursion int binarysearch(int begin, int end, int a[], int key); void main() { const int size= 10; i

我想设计一个二进制搜索算法,使用递归将您要查找的项目与第33百分位和第66百分位的项目进行比较,而不是与中点进行比较

这就是我到目前为止所做的:

#include <iostream>
using namespace std;
//binary search recursion


int binarysearch(int begin, int end, int a[], int key);


void main()
{
    const int size= 10;

    int a[size] = { 22,32,45,55,65,75,90,100 };

    cout<<binarysearch(0, 7,a, 90);
}


int binarysearch(int begin,int end,int a[],int key)
{
    int b = begin+(end-begin) * (1.0/3.0);
    int c = begin +( end-begin)*(2.0 / 3.0);

    if (begin > end)
    {
        return -1;
    }
    if (a[b] == key)
    {
        cout << "b is the key";
        return b;
    }
    if (a[c] == key)
    {
        cout << "c is the key";
        return c;
    }

    if (a[begin] < key&&a[b]>key)
    {
        return binarysearch(begin, b-1, a, key);
    }

    if (a[b ] < key&&a[c ]>key)
    {
        return binarysearch(b + 1, c - 1, a, key);
    }

    if (a[c ] < key&&a[end]>key)
    {
        return binarysearch(c + 1, end, a, key);
    }

}
#包括
使用名称空间std;
//二进制搜索递归
int-binarysearch(int-begin,int-end,int-a[],int-key);
void main()
{
常数int size=10;
inta[size]={22,32,45,55,65,75,90100};
库特基)
{
返回二进制搜索(c+1,end,a,key);
}
}

是这样吗?有什么建议吗?

您的递归逻辑仍处于关闭状态。您不需要
begin2
end2
参数;它们只是增加了混乱,没有任何用处。你的逻辑应该是这样的:

  • 查找
    b
    c
    ,1/3和2/3间隔。(您现在这样做是正确的)
  • 如果
    a[b]
    a[c]
    等于
    key
    ,则您已找到结果。(你这样做也是正确的)
  • 否则,确定三个间隔
    中的哪一个可能在。这三种可能性是[
    begin
    b-1
    ,[
    b+1
    c-1
    ],以及[
    c+1
    end
    ]。相应地重现。(这是您未正确执行的部分。)
  • 您还应该再添加一条逻辑:如果
    begin>end
    ,则键根本不在
    a


    我不打算说得比这更具体,因为这听起来像是一个作业,你应该自己写代码。

    嗯,
    begin
    end
    之间的1/3点是
    begin+(end-begin)*(1.0/3.0)
    ,而不是
    (begin+end)*(1.0/3.0)
    。(您可以将其编写为
    (2.0*开始+结束)/3.0
    )类似地,对于2/3点:使用
    (开始+2.0*结束)/3.0
    。如果开始=0,结束=9,那么9/3=3和18/3,这两种方法都可以工作=6@lolsharp但是对于begin=6和end=9不起作用只要
    begin
    不是0,您的方法就不起作用。它可能一开始是0,但在第一次递归的3种可能性中的2种之后,它就不会了。好吧,我想我现在看到了。嘿,我想我现在有了正确的代码,至少我希望如此。虽然没有你,我不认为我会找到这个解决方案。我是一名康普商学院的本科生,这是我的第一门数据结构课程,我真的想知道如何才能达到与你一样优秀的程度?@lolsharp-编码的主要目的是将问题分解成可管理的部分。测试你的假设(就像你第一次尝试计算1/3和2/3分区时应该做的那样)。如果某件事情没有如预期的那样起作用,在你对到底出了什么问题有了合理的假设之前,不要尝试新的事情。学习使用调试工具。正如这位纽约本地人在被问到如何才能到达卡内基音乐厅时告诉一位游客的那样,“练习,练习,练习”。祝你学习顺利!