二分搜索,"midpoint"占三分之一

Binary search with "midpoint" at one third

本文关键字:三分之一 midpoint 二分搜索      更新时间:2023-10-16

不与中点比较,我想设计一个二进制搜索算法,使用递归将您正在查找的项目与第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);
    }
}

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

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

  1. 找到bc, 1/3和2/3区间。(你现在做的是正确的)
  2. 如果a[b]a[c]等于key,那么你已经找到了结果。(你也在做正确的)。
  3. 否则,决定key可能处于三个间隔中的哪一个。这三种可能是[begin, b-1], [b+1, c-1]和[c+1, end]。相应的递归。(这是你没有正确做的部分)

您还应该添加一个逻辑:如果begin > end,则键根本不在a中。

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