折半查找

一.题目要求

·题目

输入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是一样的吗。。。
大家来找找错误。

上一篇:css 图片在div中居中


下一篇:归并排序