二分搜索,"midpoint"占三分之一
Binary search with "midpoint" at one third
不与中点比较,我想设计一个二进制搜索算法,使用递归将您正在查找的项目与第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);
}
}
这样对吗?有什么建议吗?
您的递归逻辑仍然关闭。你不需要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
中。
我不想说得更具体了,因为这听起来像是一个作业,你应该自己写代码
相关文章:
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 我可以使用 g++ 进行三种比较 (<=>) 吗?
- 我应该使用什么来代替void作为变体中的替代类型之一
- 是默认情况下分配给char数组常量的值
- 将两个数组中的差异记录在第三个数组中
- 如何将三维尺寸不固定的三维阵列展平为一维阵列
- 将数字转换为字母(例如:123 转换为一二三)
- 输出一个数字,该数字可能是三种类型之一
- 异常处理:如果用户输入不是三个特定字符之一
- 如何找到季度的月份而不是每月的四分之一
- 有效识别给定角度角度的轴四分之一
- 使用QandroidJniObject未调用的三个函数之一
- 关于实施其中之一的CPP,这三个规则究竟是什么?
- gldrawelements仅画一半四分之一
- 为什么?(三分)在catch块中存在
- 图像四分之一FFT通常效果更好
- 确定 C++ 中整数集合中的第三个四分位数
- 使用 GLU 在 c++ 中绘制四分之一圆
- 将货币金额四舍五入到最接近的镍、四分之一、1 美元、5 美元等面额的最佳方法是什么?
- 二分搜索,"midpoint"占三分之一