折半查找法 / 二分查找法

任务介绍:在一个有序的数组中查找具体的某个数字 n 。

方法一:挨个查找

        顾名思义,我们通过一个一个地查找数组的下标,直到找到我们要的数字

#include <stdio.h>

int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
		//下标为:0,1,2,3,4,5,6,7,8,9

	int num = 7;
	//在数组中找到数字7
	int i = 0;
	int sz = sizeof(arr) / sizeof(arr[0]);
		//元素个数 = 数组的总元素字节长度 / 单个元素的字节长度 

	for (i = 0; i < sz; i++)
		//一个一个地查找数组的下标
	{
		if (num == arr[i])
		{
			printf("找到了,下标为:%d\n", i);
			printf("数字为:%d\n", arr[i]);
			break;
		}
	}
	if (i == sz)
		//说明要查找的数字不在数组中
	{
		printf("找不到!\n");
	}
	return 0;
}

方法二:折半查找

        折半查找法是效率较高的一种查找方法。在有序的数组中我们通过每次查找数组的中间下标,将我们要找到数字的范围缩小一半。

        基本思想是:设我们要找的数字为 “num” ,定义左下标 “left” 为0,右下标 “right” 为元素的个数-1,中间下标 mid =(left+right)/ 2 取商,在循环语句中用中间下标所对应的值 “arr[mid]”  与“num” 比较,若“arr[mid]” 大于 “num” ,则将右下标替换为 “mid - 1”,到左半段继续查找 ,若“arr[mid]” 小于 “num” ,则将左下标替换为 “mid + 1” ,到右半段继续查找,以此类推。直到“arr[mid]” 等于 “num” ,则输出我们所要找的值,停止查找。

        如果左下标 “left” 大于右下标 “right” ,说明没有该数字,程序结束。

#include <stdio.h>

int main()
{
	int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
	    //下标为:0,1,2,3,4,5,6,7,8,9

	int sz = sizeof(arr) / sizeof(arr[0]);
	//元素个数 = 数组的总元素字节长度 / 单个元素的字节长度

	int left = 0;//数组的左下标
	int right = sz - 1;//数组的右下标
	int num = 7;//要找的数字
	while (left <= right)
	{
		int mid = (left + right) / 2;//中间下标
		if (arr[mid] > num)
			//“arr[mid]” 大于 “num” ,则将右下标替换为 “mid - 1”,到左半段继续查找
		{
			right = mid - 1;
		}
		else if (arr[mid] < num)
			//“arr[mid]” 小于 “num” ,则将左下标替换为 “mid + 1”,到右半段继续查找
		{
			left = mid + 1;
		}
		else
		{
			printf("找到了,下标为:%d\n", mid);
			printf("数字为:%d\n", arr[mid]);
			break;
		}
	}
	if (left > right)//当左下标大于右下标时,说明没有我们要找的数字
	{
		printf("找不到!\n");
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值