二分探索法(二分探索法)

二分探索

1.利点は、比較の数が比較的少なく、検索したい数をすばやく見つけることができるため、時間がかかりません。
2.欠点は、この方法では検索するテーブルを順序付けする必要があり、挿入と削除が難しいことです。

1.例として1次元配列を使用します。

たとえば、1次元配列a [10] = {2,5,7,8,9,15,20);この配列でkey = 15の位置を見つけます。(これは例であるため、この配列は順序付けられています。順序付けされていない配列に遭遇した場合は、最初に並べ替えることができますが、実際には、カンフーのようなものです。それを使用すると、より時間がかかります)ここに画像の説明を挿入
図に示すように、最小データを低く、最大データを高く、中央値を中央として記録します(中央が整数でない場合、四捨五入する必要があります)
2つのポイントを使用しますメソッドで検索する場合は、最初に検索するキーの値をmidと比較します。たとえば、この例では、8と15が比較され、8は15より小さいため、範囲は[8、20]に減少します。インターバル内。次に、この間隔で上記のメソッドを引き続き使用します
。C言語コードは次のとおりです。

#include<stdio.h>
int search(int a[],int n,int key)
{
   int low=0;
   int high=n-1,mid;
   while(low<=high)
   {
      mid=(low+high)/2;
      if(key==a[mid]);
      	return mid;
      if(key>a[mid])
      		low=mid+1;
      	else high=mid-1;
   }
return -1;
}

int main()
{
   int a[]={2,5,7,8,9,15,20};
   printf("%d",search(a,7,15));
   return 0;
}

2. 2次元配列を使用して半分で検索します。

検索には2桁の配列が使用されるため、2次元配列の各行と列が順序付けられます。
例:3 * 5の2桁の配列があります。図に示すように、ここに画像の説明を挿入
各行と各列が増分されます各行が増分されるため、最初に右上隅の数字9をベンチマークとして使用するため、数値を数値9と比較します。数値が9より大きい場合、数値9の列は変更されず、行数が1増加します。これは、数値12にジャンプするのと同じです。次に、検索される数値を数値12と比較します。 、その後、番号12の行の数は変更されず、列の数は-1になります。次に、上記のプロセスを繰り返すと、見つけることができます。

注:ループの終了条件:1は、必要な数を見つけて終了することです。2が見つからない、終了する、数が見つからない、行の数が増加した、配列の境界を超えた、または列の数が減少した、境界を超えた場合の2つの可能性があります。
完全なコードは次のとおりです。

#include<stdio.h>
int main()
{
  int n,m,key,i,j;
  int a[10][10];
  scanf("%d %d",&n,&m);
  for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
      scanf("%d",&a[i][j]);
  scanf("%d",&key);
  i=1;j=m;   //将与key作比较的点选为右上角
  while(i<=n&&j>=1)
  {
    if(a[i][j]==key)
    {
      printf("%d %d",i,j);
      return 0;
    }
    if(a[i][j]<key)
        i++;
    else  j--;
  }
  printf("-1");    //找不到则输出-1
  return 0;
  }
オリジナルの記事を10件公開 Likes2 訪問数217

おすすめ

転載: blog.csdn.net/dfwef24t5/article/details/104140669