私は、ソートされた配列内の回転点を、変更されたバイナリ検索によって探し出そうとしています。ソートされた配列内の回転点を見つける
ここで、回転の点は、私は上記の操作のために、この機能を書いた9
でインデックス= 3すなわちであり、この配列int values[9]={7, 8, 9, 1, 2, 3, 4, 5, 6};
検討します。
void FindRotationPoint(int values[], int numvalues)
{
int first =0;
int last = numvalues-1;
int middle;
bool moreTosearch= (first<=last);
while(first<=last)
{
middle = (first+last)/2;
if(values[0]>values[middle]) //Keep looking right if the middle value in array is greater than first
{
last = middle-1;
}
if (values[0]<values[middle]) //Keep looking left if the middle value in array is less than first
{
first = middle+1;
}
}
cout<<middle+1<<endl;
cout<<values[middle];
}
要素は int values[9]={7, 8, 9, 1, 2, 3, 4, 5, 6};
出力された場合:4,1(間違った)
int values[9]={7, 8, 9, 10, 2, 3, 4, 5, 6};
出力:4、10である回転
点(正)偶数の場所が正しく見つかったのに対して、それ以外の場合は後続の要素が見つかる。上記のコードでは何が分かりませんか?
moreTosearchは常にちょうど(拳<=最後)であるので、おそらくあなたはそれを削除する必要があり、しばらくの状態で最後の= <最初に入れました。これは物事をよりコンパクトに、読みやすいようにします。 – quasiverse
また、重複した要素がある場合、これは機能しない可能性があります。 – quasiverse
9はインデックス3ではなくインデックス2にあります。 – ildjarn