折半查找

一.题目要求

·题目

输入n(n<100)个有序正数,请用折半查找算法,查找x在其中的位置。

·测试

输入:5 1,2,3,4,5 2
输出:2
注:测试集合中,x数一定在正数数组中。即不用处理错误逻辑。

二.题目分析

  1. 输入的第一个数是数的个数,第二组数是一组有序的数,即不需要自己排序,第三个数则是要查找的数。
  2. 折半查找,也称二分查找,即利用二分法进行查找。在某些情况下相比于顺序查找,使用折半查找算法的效率更高。但是该算法的使用的前提是静态查找表中的数据必须是有序的。

三.代码实现

#include <stdio.h>
int main() {
	int n, i;
	int series[100];
	int t;
	int right, left, middle;
	//输入
	scanf_s("%d", &n);
	for (i = 0; i < n; i++) {
		scanf_s("%d,", &series[i]);
	}
	scanf_s("%d", &t);
	//初始化
	left = 0;
	right = n - 1;
	middle = (n - 1) / 2;
	//二分法查找
	while (series[middle] != t) {
		if (series[middle] < t) right = middle;
		else left = middle;
		middle = (left + right) / 2;
	}

	printf("%d", middle);
	return 0;
}

好吧,上面的代码还是运行不了(似曾相识)。
调试的时候发现数组元素的输入没有成功,但是没有找到错误的原因。
然后我在网上找到了小刘同学分享的代码。
点击跳转到:折半查找
我这里也展示一下他的源码。

#include <stdio.h>
int main()
{
	int num[100];
	int a,b,flag,i=0;
	scanf("%d",&a);
	for(i=0;i<a;i++)
	{
		scanf("%d,",&num[i]);
	}
	scanf("%d",&b);
	int left=0,right=a-1;
	while(left<=right)
	{
	    flag = (left+right)/2;
	    if(b==num[flag])
	    {
			printf("%d",flag+1);
			break;
		}
	    if(num[flag] > b)
	        right = flag-1;
	    else if(num[flag] < b)
	        left = flag+1;
	}
} 

我对比了一下,除了二分查找的实现部分,前面的不~TM~是一样的吗。编译器报错说series使用了空的存储空间,我还因为是前面输入部分有误。
大家不妨来找找错误。
·调试ing
·思考ing
·调试ing
·思考ing
·调试ing
·思考ing
·调试ing
·思考ing
·调试ing
·思考ing
💡历经千辛万苦,终于找到错误了。
其实是很低级的错误,二分查找的循环里面left和right弄反了。。。
另外,还没有考虑到要找的数就是端点值的情况。

四.修改

#include <stdio.h>
#include <math.h>
int main() {
	int n, i;
	int series[100];
	int target;
	int right, left, middle;
	//输入
	scanf_s("%d", &n);
	for (i = 0; i < n; i++) {
		scanf_s("%d,", &series[i]);
	}
	scanf_s("%d", &target);
	//初始化
	left = 0;
	right = n - 1;
	middle = (n - 1) / 2;
	//二分法查找
	if (series[right] == target) printf("%d", n);
	else if ((series[left] == target)) printf("%d", 1);
	else {
		while (series[middle] != target) {
			if (series[middle] < target) left = middle;
			else right = middle;
			middle = (left + right) / 2;
		}
		printf("%d", middle + 1);
	}
	
	return 0;
}
posted @ 2021-05-21 17:25  酸柚子sour  阅读(658)  评论(0)    收藏  举报
Akizuki-Kanna