C言語二分探索

目次

1. 二分探索アルゴリズム

第二に、分岐ステートメントで注意を払う必要がある小さなポイント


 

1. 二分探索アルゴリズム

いわゆるバイナリ検索は、指定された数が一連の順序付けられたシーケンスのこのシーケンスにあるかどうかを見つけることです。

主な手順は次の 3 つです。

1. 検索範囲の左右の添字を決定する
2. 左右に応じて中間要素の添字 mid を決定する
3. mid-locked との比較により左右の新しい検索範囲を決定する要素と検索された要素

 次の 3 つの手順について、図とコードを使用して説明します。

1. 指定された配列の要素数が奇数であると仮定します

2. 与えられた配列が偶数であると仮定します

 3. 与えられた数がこの数列にないと仮定する

 上記の 3 つの状況に応じて、コードは次のように記述できます。

#include <stdio.h>
int main()
{
    int arr[] = { 1,2,3,4,5,6,7,8,9,10,11,12,13 };
    int left = 0, right = sizeof(arr) / sizeof(arr[0]) - 1;
    int x = 0,flag = 0;

    scanf("%d", &x);//要找的数

    while (left <= right)//若要找的数在此数组中,此条件会一直成立;
                         //若要找的数不在此数组中,最终left会大于right,从循环中跳出
    {
        int mid = (left + right) / 2;
        if (x == arr[mid])
        {
            printf("%d\n", mid);
            flag = 1;
            break;
        }
        else if (x > arr[mid])
        {
            left = mid + 1;
        }
        else
        {
            right = mid - 1;
        }
    }
    if (flag == 0)//只有当要找的数在数组中找不到时flag == 0
    {
        printf("找不到\n");
    }
    return 0;
}

 要約: 上記の例からわかるように、二分法は非常に効率的な方法です。可能性の半分を一度に除外できるからです。ただし、二分法は順序付けられたシーケンスにのみ適用されることに注意してください

第二に、分岐ステートメントで注意を払う必要がある小さなポイント

1. ぶら下がっているelse文

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
		if (b == 2)
			printf("hehe\n");
		else
			printf("haha\n");
	return 0;
}

上記のコードでは、どの if ステートメントが else ステートメントとペアになっているかを誤解する人がいるかもしれません。

実際、else は最も近い if に一致します。しかし、上記のように書くと曖昧になりやすいです。次の形式で記述できます。

#include <stdio.h>
int main()
{
	int a = 0;
	int b = 2;
	if (a == 1)
	{
		if (b == 2)
		{
			printf("hehe\n");
		}
	}
	else
	{
		printf("haha\n");
	}
	return 0;
}

{} を適切に使用すると、コードのロジックがより明確になります。

2. switch ステートメントのブレーク

スイッチはネストされた使用を可能にします

#include <stdio.h>
int main()
{
	int n = 1;
	int m = 2;
	switch (n)
	{
	case 1:
		m++;//m == 3
	case 2:
		n++;//n == 2
	case 3:
		switch (n)
		{//switch允许嵌套使用
		case 1:
			n++;
		case 2:
			m++;//m == 4
			n++;//n == 3
			break;
		}
	case 4:
		m++;//m == 5, n == 3
		break;
	default:
		break;
	}
	printf("m = %d, n = %d\n", m, n);
	return 0;
}

上記のコードでは、一部の case ステートメントの後にブレークがありません。これにより、ブレークのない case ステートメントが実行された後に、その下の case ステートメントが実行され、異なる判定出力結果が得られる可能性があります。スイッチは条件判断の機能を実行することが多いため、最適です。

すべての有効な case ステートメントの後にブレークを追加します。また、すべての switch ステートメントに default 句を配置することをお勧めします。また、その後にブレークを追加することもできます。

おすすめ

転載: blog.csdn.net/m0_74265792/article/details/130301993