栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c语言二分法查找数组中的数据 2021-10-29

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c语言二分法查找数组中的数据 2021-10-29

C语言折半查找
题目:折半查找,在从小到大的数组中查找关键字key,找到其返回下标,失败则返回-1。
注意:一定要数组有序,否则没有这种算法,只可以从头到尾遍历。
代码:

#include
#include
//折半查找(二分查找,一定数组有序)  时间复杂度O(logn)
int BinSearch(int arr[], int len, int key)
{
	assert(arr != NULL); //安全处理机制
	if (NULL == arr)
	{
		return -1;
	}

	int low = 0;   //左边指针
	int high = len - 1;  //右边指针
	int mid;//int mid = (low + high)/2; //每次缩小一半,需要和key比较的中间值

	while (low <= high)//当low和high之间范围内  至少有1个值,则继续比较
	{
		mid = (low + high) / 2;//mid = (high-low)/2 + low;//让mid指向临时的范围中间值

		if (arr[mid] == key)//如果mid指向的值就是key   则直接返回其下标
		{
			return mid;
		}
		else if (arr[mid] < key)  //如果mid指向的值小于key   则要找的key这个值一定在mid的右半边
		{
			low = mid + 1;
		}
		else//如果mid指向的值大于key   则要找的key这个值一定在mid的左半边
		{
			high = mid - 1;
		}
	}

	//此时while循环结束,还没有退出函数,则要找的这个值 一定不存在于这个数组内,则返回-1
	return -1;

}

int main()
{
	int arr[] = { 1,3,4,5,8,10,20,23,36,50 };
	int tmp = BinSearch(arr, sizeof(arr) / sizeof(arr[0]), 8);
	int main()
{
	int arr[] = { 1,3,4,5,8,10,20,23,36,50 };
	int tmp = BinSearch(arr, sizeof(arr) / sizeof(arr[0]), 10);
	//printf("所查找的数字在第%d个。", tmp);
	if (tmp >=0)
	{
		printf("所查找的数字在第%d个。", tmp);
	}
	else
	{
		printf("所查找数字不存在。");
	}
}
}

运行结果:
(1)当查找的数字为8时:

(2)当查找的数字为-1时:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/384215.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号