【C语言初阶】:二分查找算法(Binary Search)

【C语言初阶】:二分查找算法(Binary Search)_第1张图片
【引入问题】:假如现在我买了一件衣服,你非常好奇的问我多少钱,我说不超过500元。你还是很好奇,我让你接着猜,你才怎么猜呢?答案肯定是你每次猜最中间的数,第一次猜250,假如我有告诉你猜高了,你肯定会在小于250的部分继续除以2进行猜值,这就引入了二分查找的算法。
*二分查找也叫折半查找,是一种效率比较高的查找方法。但是,二分查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。


【查找过程】: 假设表中元素是按升序排列,将表中间位置的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置的关键字将表分成前、后两个表,如果中间位置的关键字大于查找关键字,则进一步查找前面的表,否则进一步查找后面的表。一直重复以上过程,直到找到满足条件的关键字,查找成功,或表里没有关键字,查找失败。

【比较次数】:

计算公式:
☹当顺序表有n个关键字时:查找失败时,至少比较a次关键字;查找成功时,最多比较关键字次数是b。
*【算法要求】:必须按关键字大小有序排列。

【程序设计】:

【C语言初阶】:二分查找算法(Binary Search)_第2张图片

【函数实现】:怎么用函数来实现一个二分查找呢?参考代码如下:

#include
#include

int binary_search(int arr[], int key, int left, int right)
{
	int mid = 0;
	while (left <= right)
	{
		mid = left + (right - left) / 2;
		if (arr[mid]== key)
			return mid;
		else if (arr[mid] < key)
			left=mid+1;
		else
			right=mid-1;
	}
	return -1;
}
int main()
{
	int arr[10] = { 0 };
	int i = 0;
	int key = 0;
	int ret = 0;
	int left = 0;
	int right = sizeof(arr) / sizeof(arr[0]);
	printf("请输入一个有序数列:\n");
	for (i = 0; i < 10; i++)
	{
		scanf_s("%d", &arr[i]);
	}
	printf("请输入要查找的数:\n");
	scanf_s("%d", &key);
	ret = binary_search(arr, key, left, right);
	if (-1==ret)
	{
		printf("找不到");
	}
	else
	{
		printf("找到了,下标是%d\n", ret);

	}
	system("pause");
	return 0;
}


你可能感兴趣的:(C语言)