二分探索
1 はじめに
C 言語では、通常、次の 2 種類の検索を使用します。
(1) 順次検索
(2)二分探索
2. 逐次検索ケースのデモンストレーション
数列があります: {23, 1, 34, 89, 101}
数字当てゲーム: キーボードから任意の数字を入力し、その数字がその数列に含まれるかどうかを判断します [数列検索] 要件: 見つかった場合は、それを見つけるように促します、および give 添え字の値が表示されますが、見つからない場合はプロンプトは表示されません。
アイデア: 走査用の配列を作成し、1 つずつ比較し、等しい場合は検索します。
#include <stdio.h>
int seqSearch(int arr[],int arrLen,int val ){//数组,数组的大小,要查找的值
int i;
for(i=0;i<arrLen;i++){
if(arr[i] == val){
return i;
}
}
//如果在for循环中,没有执行到return,说明没有找到
return -1;
}
int main(){
//有一个数列:{23,1,34,89,101}
//猜数游戏:从键盘中任意输入一个数,判断数列中是否包含该数【顺序查找】
//要求: 如果找到了,就提示找到,并给出下标值, 找不到提示 没有。
//分析思路
//1.建立数组进行遍历,一个一个的比较,如果相等,则找到
int arr[] = {23,1,34,88,102};
int arrLen = sizeof(arr) / sizeof(int);
int index = seqSearch(arr,arrLen,102);//调用函数
if(index != -1){//没有找到
printf("找到下标为%d",index);
}else{
printf("没有找到");
}
getchar();
}
3. 二分探索事例のデモンストレーション
順序付けされた配列に対して二分検索 {1,8, 10, 89, 1000, 1234} を実行し、数値を入力してその
数値が配列内に存在するかどうかを確認し、添え字を見つけてください。存在しない場合は、「そのようなものはありません」というプロンプトが表示されます。番号」。
二分查找的前提是,该数组是一个有序数组
思路分析:
我们要查找的数是findVal
1.先找到数组中间这个数,和findval比较
2.如果midVal > findVal说明,应该在midVal的左边查找
2.如果midVal < findVal说明,应该在midVal的右边查找
4.如果midVal = findVal,说明找到
5.还有一个问题,没有考虑找不到的情况
如果leftIndex > rightIndex ,说明这个数组都比较过,但是没有找到
//二分查找
#include <stdio.h>
int binarySearch(int arr[],int leftIndex,int rightIndex,int findVal){
//如果leftIndex > rightIndex ,说明这个数组都比较过,但是没有找到
if(leftIndex > rightIndex){
return -1;
}
//先找到数组中间这个数midVal
int midIndex = (leftIndex + rightIndex) / 2;//中间数的下标
int midVal = arr[midIndex];
//如果midVal > findVal说明,应该在midVal的左边查找
if(midVal > findVal){
binarySearch(arr,leftIndex,midIndex-1,findVal);
}else if(midVal < findVal){
//应该在midVal的右边查找
binarySearch(arr,midIndex+1,rightIndex,findVal);
}else{
return midIndex;//返回该数的下标
}
}
int main(){
int arr[] = {
1,8,10,89,1000,1234};
int arrLen = sizeof(arr) / sizeof(int);
int index = binarySearch(arr,0,arrLen-1,89);
if(index!=-1){
printf("index = %d",index);
}else{
printf("没有找到");
}
getchar();
}