2016-09-25 9 views
-1

中間点と比較する代わりに、再帰を使用して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); 
    } 

} 

です:

これは私がこれまで持っているものでしょうか?助言がありますか?

+0

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'を使います。 –

+0

begin = 0、end = 9なら9/3 = 3と18/3 = 6の場合はどちらかの方法が有効でしょうか? – lolsharp

+0

@lolsharpしかし、begin = 6とend = 9の場合は動作しません。 – MBo

答えて

0

再帰ロジックはまだオフです。 begin2end2引数は必要ありません。彼らはちょうど混乱を追加し、有用な目的を果たしません。あなたのロジックは次のように行く必要があります。

  1. 、1/3と2/3の間隔をbcを探します。 (あなたは今それを正しくやっています)。
  2. a[b]またはa[c]keyの場合、結果が見つかりました。 (あなたもそれを正しくやっています)。
  3. そうでなければ、であるかもしれない3つの間隔keyのかを決定する3つの可能性がある[beginb-1]、[b+1c-1]、および[c+1end]。それに応じて再帰。 (これは、あなたが正しく行っていない部分である。)また、ロジックの1つの以上の部分を追加する必要があります

begin > end場合、鍵はまったくaではありません。

これ以上は具体的にはなりません。これは割り当てのように思えますし、独自のコードを書く必要があるからです。

+0

ちょっと、私は正しいコードを持っていると思います。あなたがいなくても、私はこの解決策に来ただろうとは思わない。私は学部生です。これは私の最初のデータ構造コースです。本当に私があなたと同じくらい良いところに到達するにはどうすればいいのですか? – lolsharp

+0

@lolsharp - コーディングの主なものは、問題を管理可能なチャンクに分割することです。あなたの前提をテストしてください(1/3と2/3部門を計算するための最初の試みで済むはずです)。何かが期待どおりに機能しない場合は、実際に間違っていることについて合理的な仮説を立てるまで、何か新しいことを試してはいけません。デバッグツールの使用方法を学びます。そして、ニューヨークのネイティブが観光客に、カーネギーホールに行く方法を尋ねたところ、「練習、練習、練習」を話しました。あなたの研究に幸運を祈る! –