【C言語】構造体を2分探索で検索する方法を解説

目次から探す

構造体を2分探索する方法

構造体を2分探索する方法について解説します。

構造体は、複数のデータをひとまとめにするためのデータ型であり、配列と組み合わせて使用することができます。

2分探索は、ソートされた配列から特定の要素を高速に検索するアルゴリズムです。

以下では、構造体の配列をソートする方法と、2分探索を実装する手順について説明します。

構造体の配列をソートする

まず、構造体の配列をソートする方法について説明します。

構造体の配列をソートするためには、比較関数を用意する必要があります。

比較関数は、2つの構造体を受け取り、その大小関係を返す関数です。

以下に、構造体の配列をソートするための比較関数の例を示します。

int compare(const void* a, const void* b) {
    // 比較する要素の型にキャストする
    const struct MyStruct* structA = (const struct MyStruct*)a;
    const struct MyStruct* structB = (const struct MyStruct*)b;
    // 比較演算子を使って大小関係を判定する
    if (structA->key < structB->key) {
        return -1;
    } else if (structA->key > structB->key) {
        return 1;
    } else {
        return 0;
    }
}

この比較関数を用いて、qsort関数を使って構造体の配列をソートすることができます。

以下に、構造体の配列をソートする手順を示します。

  1. 構造体の配列を用意する。
  2. qsort関数を呼び出し、ソートする範囲と比較関数を指定する。
struct MyStruct array[] = { /* 構造体の配列の初期化 */ };
int size = sizeof(array) / sizeof(array[0]);
qsort(array, size, sizeof(struct MyStruct), compare);

2分探索を実装する手順

次に、2分探索を実装する手順について説明します。

2分探索は、ソートされた配列から特定の要素を高速に検索するアルゴリズムです。

以下に、2分探索を実装する手順を示します。

  1. 検索対象の値を指定する。
  2. 検索範囲の始点と終点を指定する。
  3. 検索範囲の中央の要素を取得する。
  4. 中央の要素と検索対象の値を比較する。
  5. 中央の要素が検索対象の値と一致する場合、検索成功とする。
  6. 中央の要素が検索対象の値よりも大きい場合、検索範囲を前半に絞り込む。
  7. 中央の要素が検索対象の値よりも小さい場合、検索範囲を後半に絞り込む。
  8. 検索範囲が絞り込めなくなるまで、手順3から手順7を繰り返す。

以下に、構造体の配列を2分探索するためのサンプルコードの解説を示します。

int binarySearch(const struct MyStruct* array, int size, int target) {
    int left = 0;
    int right = size - 1;
    while (left <= right) {
        int mid = (left + right) / 2;
        if (array[mid].key == target) {
            return mid; // 検索成功
        } else if (array[mid].key < target) {
            left = mid + 1; // 検索範囲を後半に絞り込む
        } else {
            right = mid - 1; // 検索範囲を前半に絞り込む
        }
    }
    return -1; // 検索失敗
}

このサンプルコードでは、binarySearch関数を定義しています。

この関数は、構造体の配列と検索対象の値を受け取り、検索結果のインデックスを返します。

もし検索対象の値が見つからない場合は、-1を返します。

以上が、構造体を2分探索する方法についての解説です。

構造体の配列をソートし、2分探索を実装することで、効率的に構造体を検索することができます。

目次から探す