Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語の線形探索で配列内の最小値を見つける方法を徹底解説

C言語の探索アルゴリズムの種類

C言語で使われる代表的な探索手法は、大きく分けて以下の2つです。

  • 線形探索(リニアサーチ)
  • 二分探索(バイナリサーチ)

線形探索とは

線形探索は、配列の先頭から順番に要素を一つずつ比較しながら目的のキーを探す、最も基本的な探索アルゴリズムです。

  • データがソート(整列)されていなくても使用できる
  • 実装が非常にシンプルで理解しやすい
  • 欠点:データ数が多いほど処理時間が長くなり、システムの効率を低下させる可能性がある

入出力のイメージは以下の通りです。

入力:ソートされていない要素のリスト、探索キー
出力:
・成功 … キーが見つかった場合
・失敗 … キーが見つからなかった場合

例1:線形探索でキーを検索するCプログラム

以下は、線形探索を使って配列の中から特定のキーを探すC言語のサンプルプログラムです。

#include <stdio.h>

int main(void){
int a[50], n, i, key, flag = 0;

printf("要素数を入力してください:");
scanf("%d", &n);

printf("要素を入力してください:\n");
for(i = 0; i < n; i++)
scanf("%d", &a[i]);

printf("キーとなる要素を入力してください:");
scanf("%d", &key);

for(i = 0; i < n; i++){
if(a[i] == key){
flag = 1;
break;
}
}

if(flag == 1)
printf("探索は成功しました\n");
else
printf("探索は失敗しました\n");

return 0;
}

実行結果

要素数を入力してください:5
要素を入力してください:
12
34
56
78
89
キーとなる要素を入力してください:56
探索は成功しました

プログラムのポイント

  • フラグ変数 flag を用意し、キーが見つかったら 1 に設定してループを抜けます。
  • break 文により、見つかった時点で以降の無駄な比較を省略できます。

例2:線形探索で配列内の最小値を求めるCプログラム

次に、線形探索の考え方を応用して、配列内の最小値を求めるプログラムを紹介します。先頭の要素を仮の最小値とし、残りの要素と順番に比較していくシンプルな方法です。

#include <stdio.h>

int min_ele(int numbers[], int n){
int min = numbers[0]; /* 先頭要素を仮の最小値とする */
int i;
for(i = 1; i < n; i++){
if(min > numbers[i])
min = numbers[i];
}
return min;
}

int main(void){
int n, i, min;

printf("配列の要素数を入力してください:");
scanf("%d", &n);

int numbers[n];

printf("%d個の数値を入力してください:\n", n);
for(i = 0; i < n; i++){
scanf("%d", &numbers[i]);
}

min = min_ele(numbers, n);
printf("\n配列内の最小値は:%d\n", min);

return 0;
}

実行結果

配列の要素数を入力してください:5
5個の数値を入力してください:
23
56
78
9
20

配列内の最小値は:9

プログラムのポイント

  • 最初の要素 numbers[0] を最小値の候補として変数 min に格納します。
  • 2番目以降の要素を順に min と比較し、より小さい値が見つかれば min を更新します。
  • すべての要素を走査し終えた時点の min が、配列全体の最小値となります。

まとめ

線形探索は、データのソートが不要で実装が簡単な反面、計算量は O(n) となるため大規模なデータには不向きです。また、配列の最小値や最大値を求める処理も、「全要素を一度ずつ確認する」という点で線形探索と同じ考え方に基づいています。アルゴリズム学習の第一歩として、ぜひマスターしておきましょう。

  1. JavaScript配列で要素を検索する方法を徹底解説!find()メソッドの使い方

    JavaScriptで配列の中から特定の要素を検索したい場面は非常に多くあります。本記事では、最もよく使われるfind()メソッドを中心に、実際に動作するサンプルコードとともに分かりやすく解説します。 find()メソッドとは find()メソッドは、配列の各要素に対して指定したテスト関数(コールバック関数)を実行し、条件を満たした最初の要素の値を返します。条件に一致する要素が存在しない場合は undefined を返します。 基本構文 arr.find(callback(element[, index[, array]])[, thisArg]) callback: 各要素をテストする関数

  2. 【初心者向け】C言語のポインタを使って配列要素の合計を計算する方法

    ポインタとは?ポインタ(Pointer)とは、他の変数のアドレス(メモリ上の場所)を格納するための変数のことです。例えば、次のような変数宣言を見てみましょう。int qty = 179;この場合、変数 qty には値 179 が格納されています。ポインタは、この qty が配置されているメモリ上のアドレスを保持することができます。ポインタの宣言ポインタを宣言する構文は以下の通りです。int *p;ここで p はポインタ変数であり、他の int 型変数のアドレスを保持します。宣言時には、変数名の前に間接演算子 *(アスタリスク)を付けます。ポインタの初期化ポインタ変数を初期化するには、アドレス演