C语言——二分查找(案例)

博客介绍了C语言中常用的两种查找方法:顺序查找和二分查找。通过具体案例演示,顺序查找是对数列进行遍历比较;二分查找则针对有序数组,输入一个数判断其是否存在并求出下标,若不存在则给出提示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二分查找

1.介绍

在C语言中,我们常用的查找有两种:

(1)顺序查找

(2)二分查找

2.顺序查找案例演示

有一个数列:{23, 1, 34,89, 101}
猜数游戏:从键盘中任意输入一个数,判断数列中是否包含该数【顺序查找】 要求: 如果找到了,就提示找到,并给出下标值, 找不到提示 没有。

思路:建立数组进行遍历,一个一个的比较,如果相等,则找到

#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();
}

image-20221028140214888

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();
	
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值