目录
折半查找算法原理
折半查找(也称为二分查找)是一种在有序数组中查找特定元素的搜索算法。它的基本思想是将搜索区间不断分成两半,每次比较中间元素与目标值,然后根据比较结果排除一半的搜索区间,直到找到目标值或者搜索区间为空。
折半查找的步骤
- 确定搜索区间的初始边界,通常是数组的起始和结束下标。
- 计算搜索区间中间位置的索引
mid = (low + high) / 2
。 - 比较中间元素
arr[mid]
与目标值key
:- 如果
arr[mid]
等于key
,则找到目标值,返回中间元素的索引。 - 如果
arr[mid]
大于key
,则目标值可能在左半区间,更新high = mid - 1
。 - 如果
arr[mid]
小于key
,则目标值可能在右半区间,更新low = mid + 1
。
- 如果
- 重复步骤2和3,直到
low
大于或等于high
,如果在此之前找到了目标值,则返回相应的索引;如果搜索区间为空,则返回一个表示未找到的特殊值(通常是-1)。
折半查找的时间复杂度
折半查找的时间复杂度为O(log n),这意味着在最坏的情况下,查找操作的比较次数与数组长度的对数成正比。这使得折半查找在处理大量数据时非常高效。
折半查找的空间复杂度
折半查找的空间复杂度为O(1),因为它不需要额外的存储空间,只使用几个变量来存储搜索区间的边界和中间位置的索引。
折半查找算法是一种经典的高效搜索算法,广泛应用于已排序数据的查找场景.
例题演示:
题目描述
现有一个按非递减顺序排列,且不包含重复数字的整型数组 nums 和一个目标值 target ,请用二分法查找出数组中等于target 的元素,并返回它的下标 i (数组下标从 0 开始)否则返回 -1。
输入输出格式
输入格式
第一行输入一个整数 numsSize;
第二行输入一个数组 nums ;
第三行输入一个整数 target。
输出格式
输出一个整数。
输入输出样例1
输入
4
0 1 2 3
2
输出
2
输入输出样例2
输入
5
2 4 6 7 8
6
输出
2
具体代码:
#include<stdio.h>
int main(void)
{
int n;
int arr[100] = { 0 };
int target;
scanf("%d",&n);
for (int i = 0; i < n; i++)
scanf("%d", &arr[i]);
scanf("%d", &target);
int front = 0;
int rear = n - 1;
int middle;
int flag = 0;
while (front <= rear)
{
middle = (front + rear) / 2;
if (arr[middle] == target)
{
flag = 1;
break;
}
else if(arr[middle] > target)
{
rear = middle - 1;
middle = (front + rear) / 2;
}
else if (arr[middle] < target)
{
front = middle + 1;
middle = (front + rear) / 2;
}
}
if (flag)
printf("%d", middle);
else
printf("-1");
return 0;