2016-11-15 3 views
0

バイナリ検索を使用して、配列の順序を確認したいですバイナリ検索アルゴリズムを使用しています(つまり、各再帰呼び出しの半分で配列を分割します)。どうやってやるの? ありがとうございます。私はそれが昇順でいた場合にn個の再帰関数はサイズの配列を確認するために、私は再帰関数を書いた

+0

再帰関数は、チェック対象となる範囲の先頭と1番目にイテレータのペアを取る必要があります。その後、範囲を半分にするだけで再帰的に簡単に呼び出すことができます。 – Corristo

+2

2つの問題があります。 (1) 'if(n <= 1)がtrueを返す; - 1つの要素の配列が常にソートされます。次のコードは、少なくとも2つの要素があることを前提としています。 (2) 'return sortedAscending(x、n - 1);' - あなたは 'return'ステートメントがありません。また、最後の2行は 'return x [n - 1]> = x [n - 2] && sortedAscending(x、n - 1);' –

+0

に簡略化することができます。 –

答えて

1
bool sortedAscending(const int* x, int n) { 
    if (n <= 1) return true; 
    int m = n/2; 
    return x[m-1] <= x[m] && 
     sortedAscending(x, m) && 
     sortedAscending(x + m, n - m); 
} 
+0

はこれがO(n)の時間複雑度ですか? –

+0

はい。あなたは何か違うことを期待しましたか? –

+0

しかし、私たちは毎回半分に分かれていませんか?それはO(log2(n))ではいけませんか? –

0

候補配列の先頭と最後のポインタを使用することをお勧めします。これはイテレーターのスタイルと一貫しています。

#include <iostream> 

bool sortedAscending(const int* start, const int* end) 
{ 
    if(start == end) return true; 
    if(start + 1 == end) return true; 
    auto halfDiff = (end - start)/2; 
    return *(start + halfDiff - 1) <= *(start + halfDiff) && sortedAscending(start, start + halfDiff) && sortedAscending(start + halfDiff, end); 
} 

int main() 
{ 
    int array1[] = {0,1,2,3,4,5,6,7}; 
    int array2[] = {0,1,3,2,4,5,6,7}; 
    int array3[] = {0}; 
    int* array4 = nullptr; 

    std::cout << "Array1: " << sortedAscending(std::begin(array1), std::end(array1)) << std::endl; 
    std::cout << "Array2: " << sortedAscending(std::begin(array2), std::end(array2)) << std::endl; 
    std::cout << "Array3: " << sortedAscending(std::begin(array3), std::end(array3)) << std::endl; 
    std::cout << "Array4: " << sortedAscending(array4, array4) << std::endl; 

    return 0; 
} 
関連する問題