我想设计一种二元搜索算法,用于比较你正在寻找的项目与使用递归的第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);
}
}
这是对的吗?有什么建议吗?
答案 0 :(得分:0)
您的递归逻辑仍处于关闭状态。您不需要begin2
和end2
参数;他们只是增加了混乱,没有任何用处。你的逻辑应该是这样的:
b
和c
,即1/3和2/3间隔。 (你现在正确地做到了这一点)。a[b]
或a[c]
等于key
,那么您已找到结果。 (你也正确地这样做了。)key
可能包含的三个时间间隔中的哪一个。三种可能性为[begin
,b-1
],[b+1
,c-1
]和[c+1
,end
]。相应地递归。 (这是你没有正确做的部分。)您还应该添加一条逻辑:如果begin > end
,那么密钥根本不在a
。
我不会比这更具体,因为这听起来像是一项任务,你应该编写自己的代码。