三分之一的“中点”二进制搜索

时间:2016-09-25 04:01:05

标签: 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;

    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);
    }

}

这是对的吗?有什么建议吗?

1 个答案:

答案 0 :(得分:0)

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

  1. 查找bc,即1/3和2/3间隔。 (你现在正确地做到了这一点)。
  2. 如果a[b]a[c]等于key,那么您已找到结果。 (你也正确地这样做了。)
  3. 否则,请确定key可能包含的三个时间间隔中的哪一个。三种可能性为[beginb-1],[b+1c-1 ]和[c+1end]。相应地递归。 (这是你没有正确做的部分。)
  4. 您还应该添加一条逻辑:如果begin > end,那么密钥根本不在a

    我不会比这更具体,因为这听起来像是一项任务,你应该编写自己的代码。