二分探索
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;
}