★二分探索★


続いて、二分探索を使ってみます。

C言語編でも作った「二分探索」も基本的なアルゴリズムとして用意されています。

今回も配列を使って実際のプログラムを作ってみましょう。

<sample program cpp024-01>

#include <iostream>
#include <algorithm>

int main()
{
    const int COUNT = 10;

    int data[COUNT];

    for (int i = 0; i < COUNT; i++) {
        data[i] = i * 10;
    }

    if (std::binary_search(data, &data[COUNT], 50)) {
        std::cout << "Find" << std::endl;
    }
    else {
        std::cout << "Not Found" << std::endl;
    }

    return 0;
}

<実行結果>

Find
続行するには何かキーを押してください・・・

binary_search関数の引数は、

std::binary_search(data, &data[COUNT], 50)

「先頭アドレス」「最後のデータの次のアドレス」と「探したい値」です。

戻り値はbool型であり、発見した場合true、見つからなかった場合falseが返されます。

配列には0から10刻みで90まで格納してあります。

50は必ずありますので、「Find」という結果が表示されています。

数値を変えれば結果も変わりますので、試してみてください。


ところで、二分探索を行うには条件がありましたよね?

 データが「昇順」か「降順」に並んでいる事

これは非常に重要です。

ソートされていないデータを二分探索しても正しい答えは得られません。

しかし、標準テンプレートライブラリにはソート済みかどうか調べる関数も用意されています。

上のプログラムに追加してみましょう。

<sample program cpp024-02>

#include <iostream>
#include <algorithm>

int main()
{
    const int COUNT = 10;

    int data[COUNT];

    for (int i = 0; i < COUNT; i++) {
        data[i] = i * 10;
    }

    if (std::is_sorted(data, &data[COUNT])) {
        std::cout << "Sorted" << std::endl;
    }
    else {
        std::cout << "Not Sorted" << std::endl;
        return 1;
    }

    if (std::binary_search(data, &data[COUNT], 50)) {
        std::cout << "Find" << std::endl;
    }
    else {
        std::cout << "Not Found" << std::endl;
    }

    return 0;
}

<実行結果>

Sorted
Find
続行するには何かキーを押してください・・・

is_sorted関数を使えば、ソート済みであればtrueを返してくれます。

ただし、デフォルトは「昇順」にソート済みかどうかをチェックします。


次へ

戻る

目次へ