定义函数,实现折半查找算法。其中p指向数组,n是数组长度,x是待查找元素。主函数负责数据的定义、输入及函数调用。

题目要求:

定义函数,实现折半查找算法,函数头部为:int zb_search(int *p,int n,int x),p指向数组,n是数组长度,x是待查找元素。主函数负责数据的定义、输入及函数调用。

说明:

1)折半查找必须在一个有序数组中实现。
2)折半查找算法:先拿x与最中间元素比较,若x大,则去右边区间继续查找,若x小,则去左边区间继续查找,左右区间查找方法同上一步。所以折半意思指每次比较后查找区间减少一半。共需要定义mid,low,high3个下标,分别指向中间元素,区间下限元素和上限元素。

样例:

已有a[5]={2,4,7,9,10},输入x=7,则函数输出x在数组中位置为3.若该数不在数组中,则打印出“Not exist”

代码:

#include<stdio.h>
int zb_search(int *p,int n,int x)
{
	int low=1,high=n,mid;
	if(x==p[low]) return low;
	if(x==p[high]) return high;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(x==p[mid]) return mid;
		if(x>p[mid]) low=mid+1;
		if(x<p[mid]) high=mid-1;
	}
	return -1;
}
int main()
{
	int a[100],n,x;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	scanf("%d",&a[i]);
	scanf("%d",&x);
	int *p=a;
	int answer=zb_search(p,n,x);
	if(answer==-1)
	printf("Not exist\n");
	else printf("%d\n",answer);
    return 0;

}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,下面是折半查找函数定义主函数实现,以及比较次数的统计方法: ```c #include <stdio.h> int binary_search(int arr[], int n, int target, int *cmp_count) { int low = 0, high = n - 1, mid; while (low <= high) { mid = (low + high) / 2; (*cmp_count)++; if (arr[mid] == target) { return mid; } else if (arr[mid] < target) { low = mid + 1; } else { high = mid - 1; } } return -1; } int main() { int arr[] = {1, 3, 5, 7, 9, 11, 13, 15}; int n = sizeof(arr) / sizeof(int); int target = 11; int cmp_count = 0; int idx = binary_search(arr, n, target, &cmp_count); if (idx != -1) { printf("找到目标元素 %d,下标为 %d,比较次数为 %d\n", target, idx, cmp_count); } else { printf("未找到目标元素 %d,比较次数为 %d\n", target, cmp_count); } return 0; } ``` 折半查找函数 `binary_search` 接受四个参数,分别是: - `arr`:整型有序数组; - `n`:数组长度; - `target`:要查找的目标元素; - `cmp_count`:指向用于记录比较次数的变量的指针函数的返回值是目标元素数组中的下标,如果未找到则返回 -1。 主函数定义了一个有序数组 `arr`,目标元素11,然后调用 `binary_search` 函数进行查找,并将比较次数记录在指针变量 `cmp_count` 中。最后根据查找结果输出相应的信息。 需要注意的是,在 `binary_search` 函数中,每进行一次比较操作就需要将比较次数加一,这里使用了指针传递的方式将变量 `cmp_count` 的地址传递给函数,从而在函数内部能够修改它的值。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值