有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出"无此数"
有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出"无此数"
【答案解析】
二分查找是一个非常高效简单的查找算法,笔试和面试中非常喜欢考察。
折半查找又叫二分查找,查找的前提是序列中元素必须有序,假设区间使用[left, right)标记,待查找元素为key,具体查找的方式如下:当区间[left, right)有效时循环进行一下操作
- 找到[left, right)区间中间位置
- 如果key等于中间位置元素,则找到,返回该元素在数组中的下标
- 如果key小于中间位置元素,到数组的左半侧继续二分查找
- 如果key大于中间位置元素,到数组的右半侧继续二分查找
如果循环结束时还没有找到,则不存在该元素。
【代码实现】
#include<stdio.h>
int main()
{
int array[15] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14};
int left = 0;
int right = sizeof(array) / sizeof(array[0]);
int key = 0;
printf("请输入要查找的数字: ");
scanf("%d", &key);
// 二分查找
while (left < right)
{
// 找到中间位置
int mid = left + ((right - left) >> 1);
if (key == array[mid])
{
printf("%d\n", mid);
break;
}
else if (key < array[mid])
{
right = mid;
}
else
{
left = mid + 1;
}
}
if (left >= right)
printf("无此数\n");
return 0;
}
【结果截屏】
假设数组中元素为:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14