算法简介:二分查找也称折半查找(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;//找不到,此时返回的值不可以在数组坐标的取值范围内
}