配列検索(線形検索と二分検索)に初めて精通している

まず、ルックアップとは何かを理解しましょう。
ええと、理解することは何もありません
が、配列内の要素の位置または存在を見つけることです。
それだけです、もうありません。検索アルゴリズムについて直接学びます。

線形探索

線形検索は、バイナリ検索とは多少異なります。
配列内の要素は無秩序になる可能性があります。つまり、順番に格納されません。この方法は非常に単純で、最初の要素から始めて、逆方向に検索して比較します。それでおしまい。ループを使用して、順番に比較します。
コードを見てください。

#include <stdio.h>
int main(void)
{
    
    
	int arr[] = {
    
     5,4,6,8,7,9,10,2,3,1 };
	int len = sizeof(arr) / sizeof(arr[0]);//计算数组的元素个数
	int i;
	int n;
	scanf("%d", &n);//输入要查找的元素

	for (i = 0; i < len; i++)
	{
    
    
		if (arr[i] == n)
		{
    
    
			printf("%d的下标是%d\n", n, i);
			break;//找到后就直接跳出循环
		}
	}
	
	if (i == len)//因为如果数组元素全部遍历一遍后,都没有i++等于len后,便跳出循环再判断说不存在。
		printf("Don't have number %d\n", n);
	
	return 0;

}

線形探索は非常に単純ですが、配列要素が大きい場合はさらに面倒です。結局のところ、過去の時間をトラバースする複雑さはnです。

二分探索

私が高校の数学で学んだ二分法である二分探索を見てみましょう。原理は非常に単純です。ただし、ソートされた配列しか検索できないため、線形検索と比較していくつかの制限があります。
アレイの中間データとターゲットデータのサイズを比較することで、中間データの左側にあるか右側にあるかを判断でき、計算量が瞬時に半分になります。次に、それが見つかるか見つからなくなるまで、この方法で比較を続けます。

#include <stdio.h>
int main(void)
{
    
    
	int n;
	scanf("%d", &n);
	int arr[] = {
    
     1,2,3,4,5,6,7,8,9,10};
	int len = sizeof(arr) / sizeof(arr[0]);
	int left = 0;
	int right = len - 1;
	int mid;
	while (left <= right)
	{
    
    
		mid = (left + right) / 2;
		if (arr[mid] > n)
		{
    
    
			right = mid-1;
		}
		else if (arr[mid] < n)
		{
    
    
			left = mid+1;
		}
		else 
		{
    
    
			break;
		}
	}
	if (left <= right)
		printf("%d的下标是%d\n", n, mid);
	else 
		printf("DON't have number %d\n", n);
	return 0;

}
	/*int i = 1;

簡単な理解と記憶のために写真を見てください。
ここに画像の説明を挿入
コードを見てください。中央の要素は5で、5の右側にあります。次に、比較範囲から不要な要素を削除し、比較のために中央の要素をリセットします。
ここに画像の説明を挿入
比較のために、8の左側にある別の8を取ります。スコープを再計画します。
ここに画像の説明を挿入
7が6より大きい場合は、6の右側にあり、比較を続けます。
ここに画像の説明を挿入
このとき、left == right、whileループの条件に従って、ループに入ることができますが、arr [mid]7.要素が見つかったことを意味し、要素が壊れます。ループから飛び出し、条件が左<=右を満たしていると判断し、それがまだ保持されていることを意味し、出力されます。
それ以外の場合、ターゲット要素が11の場合、常に中央の要素の右側になります。
ここに画像の説明を挿入
次に、left = MID + 1は10、この時点では、left
右、ループはまだ終了していません。今回は、midが10以下、左= 10 + 1です。このとき、左>右、条件が満たされない場合、ループは終了し、その後条件が満たされない場合は、elseと入力します。これは、11が配列にないことを意味します。
二分探索を初めて書いたときは書きませんでした

left = mid+1;
right = mid-1;

しかし、書く

right = mid;
left = mid;

ほぼ同じだと思いましたが、実はほぼ同じですが、対象データが配列にない場合は、事前に判断してください。上記のコードの形式で条件を直接変更すると、左が常に9になり、右が常に10になり、中央が常に9になり、ループから抜け出すことができなくなります。エンドレスループ。
二分探索を書くときは必ず覚えておいてください。
これらの2つの検査、それは今のところすべてです。
ご不明な点がございましたら、アドバイスをお願いします。
見てくれてありがとう。

おすすめ

転載: blog.csdn.net/weixin_52199109/article/details/112726928