C言語:単純な二分探索

トピック

二分探索を使用して、配列内の指定された数値を見つけます。

入力

入力は 3 行で構成され、最初の行には整数 n が含まれ、2 行目にはスペースで区切られた n 個の整数が含まれ、3 行目には整数 m が含まれます。

出力

整数 m がシーケンス内で見つかった場合は、その数値が出力されます (数値が複数ある場合は、最も小さい数値が返されます)。存在しない場合は、None が出力されます。
ここに画像の説明を挿入します

知識の補足

二分検索:
二分検索は二分検索 (Binary Search) とも呼ばれ、より効率的な検索方法です。ただし、二分探索では、 線形テーブルが順次ストレージ構造を採用し、 テーブル内の要素がキーワード順に並べてください

アイデアの理解

次のように、小さいものから大きいものまで並べた 10 個の数字を入力するとします。
1 2 3 4 5 6 7 9 10 11
検索番号キーが 3 の場合、検索処理は次のようになります。
1. 先頭は次のようになります。
ここに画像の説明を挿入します
2. このとき arr[mid] = 5,キーが 5 未満の場合は、mid の左側、つまり Mid-1 の位置に移動します。
ここに画像の説明を挿入します
3. 以下のように、mid の値を 2 に再計算します。
ここに画像の説明を挿入します
4. この時点では key= 2=arr[mid] なので、ループを抜けてキー 2 を見つけます


コードは次のように実装されます
#include<stdio.h>
int main(void)
{
    
    
	int n, m, arr[40];
	int mid, low, high, key;
	scanf_s("%d", &n);
	for (int i = 1; i <= n; i++)
	{
    
    
		scanf_s("%d", &arr[i]);
	}
	scanf_s("%d", &m);

	//如果能够在序列中找到整数m,则输出编号(如果存在多个编号,返回编号最小的),如果不存在,则输出None。
	low = 1;
	high = n; 
	key = m; //m为要查找的数
	//循环进行的条件low<=high
	while (low <= high)
	{
    
    
		mid = (low + high) / 2;
		//如果要找的数key比arr[mid]小,将high重新定义为下标mid前一个下标值
		if (key < arr[mid])
		{
    
    
			high = mid - 1;
		}
		//如果要找的数key比arr[mid]大,将low重新定义为下标mid后一个下标值
		else if (key > arr[mid])
		{
    
    
			low = mid + 1;
		}
		//如果要找的数key与arr[mid]相等,则退出循环
		else if(key == arr[mid])
		{
    
    
			printf("%d\n", mid);
			goto END;
		}
		printf("None");
	}
	END:;
	return 0;
}(✪ω✪)

疑問があれば指摘して、一緒に話し合って、一緒に進めていきましょう(✪ω✪)。

おすすめ

転載: blog.csdn.net/lalala_dxf/article/details/120106732#comments_28718056