Bootstrap

画图详解二分查找算法---C语言实现

算法简介:二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列

使用前提:文章已经按升序排列

基本原理:(只要满足left<=right就一直循环执行以下流程)

                 首先将要寻找的元素(k)与数组的中间元素比较

                 1.如果 k 小于中间元素,只需在数组的前一半元素中继续寻找

                 2.如果 k 和中间元素相等,匹配成功,查找结束

                 3.如果 k 大于中间元素,只需在数组的后一半元素中继续寻找

我们假设被查找的数字位于如下数组中:

//假设被查找数字为8
int arr[11]={1,2,3,4,5,6,7,8,9,10,11};

     首先将要寻找的元素(k)与数组的中间元素比较(mind = (left+right) / 2)

 不难发现,被查找的值8大于中间元素6

只需在数组的后一半元素中继续寻找(将 left 赋值为 mind +1)

 再次修改mind的值(mind = (left+right) / 2)

再次比较,被查找的值8小于中间元素9

只需在数组的前一半元素中继续寻找(将 right 赋值为 mind -1)

 再次修改 mind 的值(mind=(left+right)/2 = 7)

 被查找的值8大于中间元素9

在数组的后一半元素中继续寻找,将 left 赋值为 mind + 1

再次执行 mind = ( left+right) / 2 

 此时 mind 的值已经等于寻找到值(下表为7),循环结束,停止寻找。

代码实现:

#include<stdio.h`>
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9,10,11 };
	int left = 0;//左下标
	int right = sizeof(arr) / sizeof(arr[0])-1;//右下标
	int k = 8;//数组中寻找的值
	int mind = 0;
	while (left <= right)
	{
		mind = (left + right) / 2;
		if (arr[mind] > k)//中间元素小于寻找的值,移动右下标
		{
			right = mind - 1;
		}
		else if (arr[mind] < k)//中间元素大于寻找的值,移动左下标
		{
			left = mind + 1;
		}
		else
			break;
	}
	if (left <= right)
	{
		printf("找到了,下表是%d\n", mind);
	}
	else
		printf("找不到\n");
	return 0;
}
//实现一个二分查找函数
int bin_search(int arr[], int left, int right, int k)
{
	int mind = 0;
	while (left <= right)
	{
		mind = (left <= right)/2;
		if (arr[mind] > k)
		{
			right = mind - 1;
		}
		else if (arr[mind] < k)
		{
			left = mind + 1;
		}
		else
			return mind;//找到了,返回下表
	}
	return -1;//找不到,此时返回的值不可以在数组坐标的取值范围内
}

;