【C言語】バイナリサーチ/点数を入力して順位を表示するプログラム

C言語 研修プログラム

ソフトウェア会社の研修時代に作成したプログラムです。
参考になればうれしいです。

今回の研修プログラムではバイナリサーチのアルゴリズムを使用しています。

バイナリサーチの特徴はこんな感じです。

・探索するデータが昇順または降順に整列してある必要がある。
・探索する範囲を半分ずつ絞っていく。

この「半分に絞る」という動きがキモで、例えば検索するデータが1万件あっても1回の処理で5,000件に絞ることが出来ます。

バイナリサーチの流れは大きく3つです。
1.基準となる中央値を選択する。
2.中央値と検索するデータを比較する。
3.一致しなければ探索範囲を半分に絞る。


サンプルでは100名のテストデータを例にしています。
なお、バイナリサーチの処理は関数にしてあります。

スポンサーリンク

Sample Code

/******************************************************************************
【バイナリサーチ】
100名のテストの点数が配列test[]に降順で格納されている。
点数を入力して順位を検索して表示するプログラム。

<lesson_009.c> ver1.00
------------------------------------------------------------------------------
作成日:
作成者:

*****************************************************************************/
//---ヘッダファイル---
#include <stdio.h>

//---マクロ宣言---
#define PEOPLE_NUM  100

//---プロトタイプ宣言---
//main関数で使用する関数をデータ型のみ定義しておく
int BinarySearch(int*, int, int);

/*****************************************************************************
---main関数---
******************************************************************************/

int main(viod)
{
  int i;
  int targetScore;      //検索する点数
  int result;           //順位を表示する
  int test[PEOPLE_NUM]; //点数を格納する配列

  //配列test[]に点数を降順に格納する。(100~1)
  for(i = 0; i < PEOPLE_NUM; i++)
  {
    test[i] = 100 - i;
  }

  //テストの点数を入力
  printf("点数を入力してください。\n");
  scanf("%d", &targetScore);

  result = BinarySearch(   /* 戻り値:順位 失敗:-1 */
             test,         /* 検索する配列 */
             PEOPLE_NUM,   /* 配列要素数 */
             targetScore   /* 検索する点数 */
           );

  if(result == -1) //BinarySearch関数の戻り値が-1だったら
  {
    printf("該当する点数はありません。\n");
    return -1;  //エラーの場合はー1を返す。(ここでmain関数終了)
  }

  printf("%d点の人の順位は %3d位です。\n", targetScore, result);

  return 0;
}

/*****************************************************************************
* 関数名 : BinarySearch
* 機  能 : バイナリサーチで順位を検索する
* 戻り値 : int   正常:順位  失敗:-1
******************************************************************************/
int BinarySearch(    /* 戻り値:順位 失敗:-1 */
  int* array,        /* 検索する配列 */
  int length,        /* 配列要素数 */
  int score          /* 検索する点数 */
)

{

  int front = 0;            //サーチする範囲の先頭
  int last = length - 1;    //サーチする範囲の後端
  int center = length / 2;  //サーチする範囲の中央(中央値)
  int true = 1;             //ループの条件
  int answer = -1;          //正常:順位  失敗:-1

  while(true)  //trueは1ずっと1のままなので無限ループ
  {
    /* 検索した点数が見つかった場合 */
    if(score ==  array[center])
    {
      answer = center + 1;
      break;  //無限ループを抜ける
    }

    if(score < array[center]) //検索点数が中央値よりも小さい場合
    {
      front = center + 1;  //検索範囲前端を中央値+1へ移動
    }
    else  //検索点数が中央値よりも大きい場合
    {
      last = center - 1; //検索範囲後端を中央値-1へ移動
    }

    /* 検索範囲の前端と後端が逆転した場合=検索結果なし */
    if(front > last)
    {
      answer = -1;   //検索結果がないので失敗:-1を代入
      return answer; //answer = -1を返して関数終了
    }
    else
    {
      center = (front + last) / 2;  //検索範囲を半分に絞る
    }
  } //ループ後端

  return answer;
}

実行例

その他:研修で作成したC言語プログラム

その他のC言語プログラムはこの投稿にまとめてあります!

C言語の初心者用コードなので是非活用して下さい。
【C言語】研修 サンプルプログラム集

コメント

タイトルとURLをコピーしました