C言語二分探索事例解説

まず二分探索とは何かを見てみましょう。

二分探索は、順序付けられた配列内の特定の要素を見つけるアルゴリズムです。配列を2つに分割し、そのつど真ん中の要素と目的の要素の大小関係を比較し、目的の要素が見つかるか、目的の要素が存在しないと判断されるまで、検索範囲を半分に減らします。特記事項:二分検索は、順序付けられた配列内の特定の要素を見つける場合にのみ適しています。

名前が示すように、順序付き配列: 小さいものから大きいものにソートされた要素の配列、または大きいものから小さいものにソートされた要素の配列など、順序に従って配置された要素の配列。

アイデア分析

二分探索の実装方法:

1)配列の長さを計算して長さ len を取得します。

    配列の左端の要素の添字値、つまり配列の最初の要素の添字値は 0 であり、left=0 として記録されます。

   配列の右端の要素の添字値、つまり配列の最後の要素の添字値は len-1 であり、right=len-1 として記録されます。

  配列の中央の要素の添字を計算する式は次のとおりです。

(left+right)/2; left は配列の最初の要素の添字、right は配列の最後の要素の添字です。

    2 つの状況に分けられます。

a. 配列の長さは奇数で、中央の要素の前の要素の数は、中央の要素の後の要素の数とまったく同じです。

例: 配列には 7 つの要素があり、左は 0、右は 6、(0+6)/2=3、配列内の添え字 3 を持つ要素の前にちょうど 3 つの要素があり、ちょうど 3 つの要素があります。配列内の添字 3 の要素の後ろにも要素が 3 つあり、中央の要素の前の要素の数は中央の要素の後の要素の数と正確に等しいため、配列内の添字 3 の要素が中央の要素になります配列の。

b. 配列の長さは偶数で、中央の要素の前の要素の数は、中央の要素の後の要素の数より 1 つ減ります。

例: 配列には要素が 6 つあり、左が 0、右が 5、(0+5)/2=2、int 型は小数点を保持しないため、整数である限り、要素はちょうど 2 つあります。配列内の添字 2 を持つ要素の前に 配列内の添字 2 を持つ要素の後ろにはちょうど 3 つの要素があり、中央の要素の前の要素の数は中央の要素の後の要素の数より 1 少ないため、要素は配列内の添字 2 は配列の中央の要素です。

2) 検索する数値が中央位置の数値より小さい場合は、中央位置の数値の左側を検索し、見つかった場合はその数値の添字値を返し、見つからなかった場合はその数値を返します。は配列内に数値が存在しないことを意味します; 検索対象の数値が中央位置の数値より大きい場合は、中央位置の数値の右側を検索し、存在しない場合は数値の添字値を返します見つからない場合は、その数値が配列内に存在しないことを意味します; 検索したい場合は、その数値が中央の位置の数値と等しい場合は、その数値の添字値を直接出力します。中間の位置。

ケース 1: 配列 arr[ ]={60,50,40,30,20,10} 内の 40 の添え字を見つけます。

ケース 2: 配列 arr[ ]={20,30,40,50,60} で添字 60 を見つけ、配列に数値 80 があるかどうかを判断します。

説明: コード記述の例としてケース 1 を取り上げます。ケース 2 では、コード記述を繰り返すのではなく、コード内の数値のみを変更します。

ケース1のコードは次のとおりです

#include <stdio.h>
int fun1(int arr[],int left,int right,int n){//arr[]表示接受实参传的数组,n接受要查找的值
	int a=(left+right)/2;//找到数组中间元素的下角标
	int b=arr[a];//把数组中间元素的值赋值给b
	if(left>right){
		return -1;
}//从中间的数右侧开始比较,left如果大于right的值依然没有找到数字
	//代表数组没有这个数字,这个if判断语句其实是和下面的else if(n>b)配合使用的
	 else if(n<b){//要查找的值小于中间元素的值
		fun1(arr,left,a-1,n);
	}//从数组中间元素的左侧找,左侧第一个元素是left的值也就是0,左侧最后一个元素的下标是a-1
	else if(n>b){//要查找的值大于中间元素的值
		fun1(arr,a+1,right,n);
	}//从数组中间元素的右侧找,右侧第一个元素的下标是a+1,右侧最后一个元素的下标是right
	else if(b==n){//要查找的值等于中间元素的值
		return a;
	}
}
void main(){
	int arr[]={60,50,40,30,20,10};
	int len=sizeof(arr)/sizeof(int);//算出数组有几个元素
    int res=fun1(arr,0,len-1,40);
   // 调用子函数,arr是数组名,0是left的值,len-1是right的值,40是要查找的数
	if(res!=-1){
		printf("找到这个数,这个数的下标是%d,这个数是%d",res,arr[res]);
	}
	else{
		printf("数组没有这个数");
	}
}

コードを実行した結果は次のようになります。

ケース 1: 配列 arr[]={60,50,40,30,20,10} 内の 40 の添え字を見つけます。

 ケース 2: 配列 arr[ ]={20,30,40,50,60} で添字 60 を見つけ、配列に数値 80 があるかどうかを判断します。

 

おすすめ

転載: blog.csdn.net/weixin_63279307/article/details/129960935