C语言二分查找案例讲解

我们先看什么是二分查找:

二分查找是一种在有序数组中查找特定元素的算法。它将数组分成两部分,每次比较中间元素和目标元素的大小关系,从而将查找范围缩小一半,直到找到目标元素或者确定目标元素不存在为止。特别注意:二分查找只适用于在有序数组里查找特定元素。

有序数组,顾名思义:按顺序排放元素的数组,例如元素按从小到大排序的数组或者是元素按从大到小排序的数组。

思路分析

如何实现二分查找

1)计算数组的长度,得到长度len。

    数组最左边的元素的下标值也就是数组第一个元素的下标值为0,记为left=0。

   数组最右边的元素的下标值也就是数组最后一个元素的下标值为len-1,记为right=len-1。

  计算数组中间元素下标的公式:

(left+right)/2;left是数组第一个元素的下标,right是数组最后一个元素的下标。

    分为2种情况:

a.数组长度为奇数,中间元素前元素个数恰好等于中间元素后的个数。

例:一个数组有7个元素,left是0,right是6,(0+6)/2=3,数组下标为3的元素前面恰好有3个元素,数组下标为3的元素后面恰好也有3个元素,中间元素前元素个数恰好等于中间元素后的个数,所以数组下标为3的元素就是数组的中间元素。

b.数组长度为偶数,中间元素前的个数比中间元素后的元素个数少一个。

例:一个数组里有6个元素,left是0,rihgt是5,(0+5)/2=2,因为int类型不保留小数,只要整数,数组下标为2的元素前面恰好有2个元素,数组下标为2的元素后面恰好有3个元素,中间元素前元素个数比中间元素后的个数少一个,所以数组下标为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