C语言基础:折半查找

输入一组(10个数)从小到大有序且不重复的整数,用折半查找法在其中查找x,若x存在,输 出该数在数组中的下标,若找不到x,显示“no”
输入包括两行数据: 第一行:包括10个int类型整数,用空格间隔,系统保证其从小到大有序且不重复(即你不需要判断该组数据是否有序且不重复); 第二行:输入待查找的int型整数x
输入样例:
1 2 3 4 5 6 7 8 9 10
5

输出样例:
4

#include<stdio.h>
int main(){
	int a[10],i,left=0,mid,x,right,flag;//mid为标值
	for(i=0;i<10;i++)
		scanf("%d",&a[i]);
	left=0;right=9;flag=0;//将数据左右定义为下标
	scanf("%d",&x);
	if(x>=a[left]&&x<=a[right])//判断输入数据是否在a内
	{	while(!flag&&left<=right)//循环不断折半靠近x,flag==0时为未找到
		{	mid=(left+right)/2;//mid为数组的中点
			if(a[mid]==x)flag=1;//找到
			else if(x>a[mid])left=mid+1;//x位于中点的右边
			else right=mid-1;//位于左边
		}
	}
	if(flag==1)printf("%d",mid);
	else printf("no");
	return 0;
}
  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
折半查找(也称二分查找)是一种用于有序数组的查找,它的时间复杂度为O(log n)。下面是使用C语言实现折半查找的代码: ```c #include <stdio.h> int binarySearch(int arr[], int left, int right, int key) { while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] == key) { return mid; } else if (arr[mid] < key) { left = mid + 1; } else { right = mid - 1; } } return -1; //未找到 } int main() { int arr[] = {2, 5, 8, 12, 16, 23, 38, 56, 72, 91}; int n = sizeof(arr) / sizeof(arr[0]); int key = 23; int index = binarySearch(arr, 0, n - 1, key); if (index == -1) { printf("未找到"); } else { printf("元素 %d 的索引为 %d", key, index); } return 0; } ``` 在上面的代码中,我们定义了一个 `binarySearch` 函数来实现折半查找。该函数接受四个参数:要查找的有序数组 `arr`,左边界 `left`,右边界 `right` 和要查找的元素 `key`。在函数体内,我们使用 `while` 循环来不断缩小查找范围,直到找到要查找的元素或者查找范围为空。具体实现中,我们首先计算出中间元素的索引 `mid`,然后将其与要查找的元素 `key` 进行比较。如果相等,则返回 `mid`;如果 `arr[mid] < key`,则说明要查找的元素在中间元素的右侧,更新 `left = mid + 1`;如果 `arr[mid] > key`,则说明要查找的元素在中间元素的左侧,更新 `right = mid - 1`。如果未找到要查找的元素,则返回 `-1`。 在上面的代码中,我们还定义了一个 `main` 函数来测试 `binarySearch` 函数。我们首先定义了一个有序数组 `arr`,然后计算出数组的长度 `n`。接下来,我们定义要查找的元素 `key` 为 `23`,并将它传递给 `binarySearch` 函数。最后,我们判断是否找到了要查找的元素,并输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值