中間点と比較する代わりに、再帰を使用して33番目のパーセンタイルと66番目のパーセンタイルで検索する項目を比較するバイナリ検索アルゴリズムを設計します。この権利は"midpoint"を1/3にしたバイナリ検索
#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);
}
}
です:
これは私がこれまで持っているものでしょうか?助言がありますか?
Um、 'begin'と' end'の間の1/3ポイントは '(begin + end)*(1.0/3.0)'ではなく 'begin +(end - begin)*(1.0/3.0)'です。 (あなたは '(2.0 * begin + end)/ 3.0'と書くことができます。)同様に2/3ポイントの場合:'(begin + 2.0 * end)/ 3.0'を使います。 –
begin = 0、end = 9なら9/3 = 3と18/3 = 6の場合はどちらかの方法が有効でしょうか? – lolsharp
@lolsharpしかし、begin = 6とend = 9の場合は動作しません。 – MBo