【引入问题】:假如现在我买了一件衣服,你非常好奇的问我多少钱,我说不超过500元。你还是很好奇,我让你接着猜,你才怎么猜呢?答案肯定是你每次猜最中间的数,第一次猜250,假如我有告诉你猜高了,你肯定会在小于250的部分继续除以2进行猜值,这就引入了二分查找的算法。
*二分查找也叫折半查找,是一种效率比较高的查找方法。但是,二分查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
【查找过程】:
假设表中元素是按升序排列,将表中间位置的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置的关键字将表分成前、后两个表,如果中间位置的关键字大于查找关键字,则进一步查找前面的表,否则进一步查找后面的表。一直重复以上过程,直到找到满足条件的关键字,查找成功,或表里没有关键字,查找失败。
【比较次数】:
计算公式:
☹当顺序表有n个关键字时:查找失败时,至少比较a次关键字;查找成功时,最多比较关键字次数是b。
*【算法要求】:必须按关键字大小有序排列。
【程序设计】:
【函数实现】:怎么用函数来实现一个二分查找呢?参考代码如下:
#include<stdio.h>
#include<windows.h>
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;
}