1.算法思路
折半查找是一种在已排序的数组或列表中查找特定元素的算法。它通过反复将待查找区间分成两部分,并确定目标值可能在哪一部分中,从而将查找范围缩小一半。这种算法的时间复杂度为 O(log n),其中 n 是数组或列表的长度。
基本步骤如下:
- 确定数组或列表的起始位置(通常是0)和结束位置(通常是数组长度减1)。
- 如果起始位置大于结束位置,则目标值不在数组或列表中,搜索结束。
- 计算中间位置(起始位置加上结束位置的一半),如果中间位置的值等于目标值,则找到目标值,搜索结束。
- 如果中间位置的值大于目标值,则将结束位置移到中间位置的左边一位。
- 如果中间位置的值小于目标值,则将起始位置移到中间位置的右边一位。
- 重复步骤2至5,直到找到目标值或确定目标值不在数组或列表中。
这种算法的优势在于每次比较都能排除掉一半的数据,因此效率很高,特别是对于大型数据集。
例,在1,2,3,4,5,6,7,8中查找数字5
2.算法实现
#include <stdio.h>
int main() {
int a[8] = { 1,2,3,4,5,6,7,8};
int right = 8, left = 0;
int key =5;
while (left <= right) {
int mid = (left + right) / 2;
if (a[mid] < key) {
left = mid + 1;
}
else
if (a[mid] > key)
right = mid - 1;
else
{
printf("找到了,下标为%d", mid);
break;
}
}
if (left > right)
printf("没找到\n");
return 0;
}