小算法大智慧—二分查找

目录

一.运用情景

二.运用条件

三.运用思路

四.代码部分

1.引入库

2.函数部分

五.执行结果

六.总结


一.运用情景

查找 同一类数据 是否存在?若存在,其位置 在哪? 


二.运用条件

一定是 有序 的条件下,从小到大或者从大到小。但是,顺序和倒序影响 if 语句中left和right的变化。


三.运用思路

length为sizeof得到的数组长度

left=0;right=length - 1;

mid=(left+right)/2
如果 a[mid]<k ,说明 a[mid]在k左边,那么left=mid+1 继续比较a[mid]与k
如果a[mid]>k ,说明a[mid]在k的右边,那么right=mid-1 继续比较a[mid]与k

而循环的条件是left>right
以上两种情况,用mid做加减,是因为mid上的值已经比较过了,直接赋值mid右一个或者左一个 的值 
当right>left的时候,即说明k不存在 


四.代码部分

1.引入库

#include<stdio.h>

2.函数部分

注意:while条件含 等于;mid的定义在while里面,每一次循环都重新定义mid;

int search(int k,int a[],int length);
int main()
{
	int a[]={1,2,3,4,5,6,7,8,9,10};
	int x;
	int loc;
	printf("请输入一个数字:"); 
	scanf("%d",&x);
	loc=search(x,a,sizeof(a)/sizeof(a[0]));
	if(loc!=-1)
	{
		printf("%d在下标为%d的位置\n",x,loc);
	 } else{
	 	printf("%d不存在\n",x);
	 }
	return 0;
 } 



 int search(int k,int a[],int length)
 {
 	int left=0;
 	int right=length-1;
 	int ret=-1;
 	while(right>=left)
 	{
 		int mid=(left+right)/2;
 		
		if(a[mid]==k)
		{
	 		ret=mid;
	 		break;
		 }
 		else if(a[mid]<k)
 		left=mid+1;
 		else right=mid-1;
	 }
	return ret;
 }

五.执行结果


六.总结

二分查找一定在有序条件下。

倒序和顺序影响left和right的变化,注意left和right的变化。

以上代码得到的结果是数组的下标

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值