二分法查找

二分法查找(又叫分半查找、拆半查找)

二分法查找 使用是有前提条件的:
    
    前提条件:数组必须是一个有序的序列 可以是递增的 也可以是递减的
    
    思想:要查找的数据x,每次与中间的位置的元素进行比较大小,来判断
               被查找的数据x,可能在 中间的左边 还是 右边

代码如下: 

#include <stdio.h>

int findByHalf(int* p, int n, int x)
{
	int low = 0;//数组的起始下标
	int high = n-1;//数组的终止下标
	int middle;//用来保存中间位置的下标
	while(low <= high)//注意此处,low==high,循环继续运行 low > high循环结束
	{
		//1.得到中间位置的下标
		middle = (low+high) / 2;
		//2.将x与中间位置的元素做比较
		if(x == p[middle])
			return middle;
		else if(x > p[middle])//假设是递增的数组,说明x可能在中间位置的右侧,所以移动low
			low = middle + 1;
		else if(x < p[middle])//假设是递增的数组,说明x可能在中间位置的左侧,所以移动high
			high = middle - 1;
	}
	//如果while循环结束后,都没有执行return middle,说明没有找到
	return -1;//用-1来代表没有找到

}


int main(int argc, const char *argv[])
{
	int a[8] = {1,3,5,7,9,10,12,15};
	//写个循环,将数组中的所有元素都用二分法查找一次
	int i;
	for(i = 0; i < 8; i++)
	{
		int ret = findByHalf(a,8,a[i]);
		if(ret == -1)
			printf("not find!!\n");
		else
			printf("%d的下标是%d\n",a[ret],ret);
	}

	return 0;
}

运行结果如下:

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值