二分查找及利用函数二分查找

Posted 凩子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分查找及利用函数二分查找相关的知识,希望对你有一定的参考价值。

二分查找及利用函数二分查找

当朋友买了一双新鞋子并说这双鞋不到600块钱,让你猜猜它的价格是多少,你会怎么猜?

一块,两块,三块······还是先说三百块,根据他给出的提示再继续折半/二分查找。显然是后者,因为它的效率较高,由此当给予一个升序排列的数组时,要代码实现查找某个元素是否在该数组中用二分查找法。

为了复习一下,我还是把普通的遍历一遍先打出来。

#include<stdio.h>
int main()

	int arr[10] =  1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ;
	int i = 0, k = 0;
	int sz=sizeof(arr)/sizeof(arr[0]);//sizeof(arr)所测得的是整个数组的大小
	printf("请输入要查找的元素:");
	scanf("%d", &k);
	for (i = 0; i < sz; i++)
	
		if (arr[i] == k)
		
			printf("找到了,其下标为%d\\n", i);
			break;
		
	
	if (i == 10)
	
		printf("没有该元素\\n");
	
	return 0;

#include<stdio.h>
int main()

	int arr[10] =  1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ;
	int i = 0, k = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);//sizeof(arr)所测得的是整个数组的大小
	int left = 0;
	int right = sz - 1;//先设定左右起始下标
	printf("请输入要查找的元素:");
	scanf("%d", &k);
	while (left <= right)//只要左比右小,就一直查找
	
		int mid = left+(right-left)/2;//mid要时时刷新,所以定义在while里面
        //(left + right) / 2,可能会出现溢出现象,不宜使用
		//left/2+right/2存在后边的情况,不宜使用(如(3+5)/2=4,3/2+5/2=3)
		if (arr[mid] > k)
		
			right = mid - 1;
		
		else if (arr[mid] < k)
		
			left = mid + 1;
		
		else
		
			printf("找到了,下标为%d", mid);
			break;
		
	
	if (left>right)
	
		printf("找不到该元素\\n");
	
	return 0;

接下来就是函数形式的二分查找了

#include<stdio.h>
int reacher(int arr[],int k,int sz)

	int left = 0;
	int right = sz - 1;
	while (left <= right)
	
		int mid = left + (right - left) / 2; 
		if (arr[mid] > k)
		
			right = mid - 1;
		
		else if (arr[mid] < k)
		
			left = mid + 1;
		
		else
		
			return mid;
		
	
	return -1;//无需判断left和right的关系,到这里只能是查无此元素
             
int main()

	int arr[10] =  1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ;
	int i = 0, k = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);//sizeof(arr)所测得的是整个数组的大小
	printf("请输入要查找的元素:");
	scanf("%d", &k);
	int ret=reacher(arr, k, sz);//sz需要在主函数算好后传过去
	if (ret == -1)              //否则,在函数中sizeof(arr)的值是首位元素的大小,无法求解sz
	
		printf("找不到该元素\\n");
	
	else
	
		printf("找到了,其下标为%d",ret);
	
	return 0;

ps:望各位大佬可以指出我的不足

以上是关于二分查找及利用函数二分查找的主要内容,如果未能解决你的问题,请参考以下文章

二分查找

二分查找

二分查找---二分法

二分查找/排序

二分查找

二分查找-学习