コンセプト:
二分探索法は二分探索法とも呼ばれ、検索対象となるテーブルが逐次記憶構造であり、テーブル内のキーサイズが順番に並んでいる必要があります。
検索プロセス:
まず検索対象のレコードが存在する間隔を決定し、次に検索対象の値と間隔の中間値を比較して間隔サイズを徐々に調整し、見つかるか見つからなくなるまで範囲を狭め続けます。 。
具体的な方法:
テーブルの中央の値と検索対象の値を比較し、両者が等しい場合は検索成功、そうでない場合は中央までのレコードを使用してテーブルを2つのサブテーブルに分割します。が間隔の中間値より大きい場合は、後のサブテーブルで検索を続行します。 ; それ以外の場合は、前のサブテーブルで検索します。目的の値が見つかるまで上記のプロセスを繰り返し、検索は成功します。それ以外の場合、ターゲットは存在せず、検索は失敗します。
アルゴリズムのアイデア:
「分割統治法」は、大きな区間を半分に「分割」し、小さな区間で探索し、分割統治し続ける方法です。
例:
質問の説明:
任意の 10 個の整数を入力し、次に別の整数を入力し、「半探索法」を使用して、その数値が順序内にあるかどうかを確認します。存在する場合はシリアル番号を出力し、存在しない場合はシリアル番号を出力します。
注: 大きな整数の状況は考慮されていません
分析: まず、10 個の入力整数は順序付けされていない可能性があるため、選択ソート方法を使用して最初にそれらをソートする必要があります。次に、二分探索法を使用して、検索する番号を見つけます。
コードは以下のように表示されます。
#include"stdio.h"
int main()
{
void sort(int a[10],int m);//排序函数
void search(int a[10],int n);//查找函数
int a[10],n,i;
printf("请输入10个整数:\n");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("请输入你想要查找的数字:\n");
scanf("%d",&n);
sort(a,10);
search(a,n);
return 0;
}
void sort(int a[10],int m)//选择排序法
{
int i,j,k,temp;
for(i=0;i<m-1;i++)
{
k=i;
for(j=i+1;j<m;j++)
{
if(a[j]<a[k])
k=j;
}
temp=a[i];a[i]=a[k];a[k]=temp;
}
printf("排序后:\n");
for(i=0;i<m;i++)
printf("%d ",a[i]);
printf("\n");
}
void search(int a[10],int n)
{
int low=0,high=9,mid,flag;//low,high分别为区间的左端点和右端点,mid为区间中间,flag存放逻辑值
while(low<=high)
{
mid=(low+high)/2;//折半
if(n==a[mid])
{
flag=1;//如果区间中间值等于待查找值,则查找成功,flag值为 1,为真
break;//找到,则终止循环
}
else
if(n<a[mid])//待查找值小于中间值,则在前一半区间内继续查找
high=mid-1;//调整右端点
else if(n>a[mid])//待查找值大于中间值,则在后一半区间内继续查找
low=mid+1;//调整左端点
}
if(flag==1)//如果找到
printf("found! 序号为:%d\n",mid+1);//mid为待查找值在数组中的下标,而mid+1才是人数数习惯中的下标
else
printf("NO found !\n");
}
デバッグ結果:
要約:
半探索法。二分探索法とも呼ばれます。順序付けされた配列またはデータにのみ適用され、検索効率は順次検索よりも高くなります。
つまり、間隔 [low, high] が与えられた場合、low の初期値は 0 で、high の初期値は配列の長さから 1 を引いたものになります。半分:mid=(low+high)/2 毎回、検索対象の値nと区間の中間値a[mid]を比較し、
n<a[mid]の場合、検索対象の値が一致することを意味しますが区間の中央の左側にあり、次に前にあります。区間の半分以内で検索を続けるため、high=mid-1 となります。
同様に、n>a[mid]の場合は、検索対象の値が区間の中央より右側にあることを意味し、区間の後半も検索が継続されるため、 low=mid となります。 n=a[mid]まで+1
して検索成功 このとき、midは検索対象の値が存在する配列の添え字であり、人数のmid+1番目の数字になります
。 high<low の場合、その番号がこの順序に存在しないことを意味し、検索は失敗します。