目次から探す
構造体を二分探索する方法
構造体を二分探索する方法について解説します。
構造体は、複数のデータをひとまとめにするためのデータ型であり、配列と組み合わせて使用することができます。
二分探索は、ソートされた配列から特定の要素を高速に検索するアルゴリズムです。
以下では、構造体の配列をソートする方法と、二分探索を実装する手順について説明します。
構造体の配列をソートする
まず、構造体の配列をソートする方法について説明します。
構造体の配列をソートするためには、比較関数を用意する必要があります。
比較関数は、二つの構造体を受け取り、その大小関係を返す関数です。
以下に、構造体の配列をソートするための比較関数の例を示します。
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関数
を使って構造体の配列をソートすることができます。
以下に、構造体の配列をソートする手順を示します。
- 構造体の配列を用意する。
qsort関数
を呼び出し、ソートする範囲と比較関数を指定する。
struct MyStruct array[] = { /* 構造体の配列の初期化 */ };
int size = sizeof(array) / sizeof(array[0]);
qsort(array, size, sizeof(struct MyStruct), compare);
二分探索を実装する手順
次に、二分探索を実装する手順について説明します。
二分探索は、ソートされた配列から特定の要素を高速に検索するアルゴリズムです。
以下に、二分探索を実装する手順を示します。
- 検索対象の値を指定する。
- 検索範囲の始点と終点を指定する。
- 検索範囲の中央の要素を取得する。
- 中央の要素と検索対象の値を比較する。
- 中央の要素が検索対象の値と一致する場合、検索成功とする。
- 中央の要素が検索対象の値よりも大きい場合、検索範囲を前半に絞り込む。
- 中央の要素が検索対象の値よりも小さい場合、検索範囲を後半に絞り込む。
- 検索範囲が絞り込めなくなるまで、手順3から手順7を繰り返す。
以下に、構造体の配列を二分探索するためのサンプルコードの解説を示します。
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を返します。
以上が、構造体を二分探索する方法についての解説です。
構造体の配列をソートし、二分探索を実装することで、効率的に構造体を検索することができます。