本文主要是介绍查找------折半查找(二分查找),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
折半查找算法原理
折半查找的步骤
折半查找的时间复杂度
折半查找的空间复杂度
例题演示:
题目描述
具体代码:
折半查找算法原理
折半查找(也称为二分查找)是一种在有序数组中查找特定元素的搜索算法。它的基本思想是将搜索区间不断分成两半,每次比较中间元素与目标值,然后根据比较结果排除一半的搜索区间,直到找到目标值或者搜索区间为空。
折半查找的步骤
- 确定搜索区间的初始边界,通常是数组的起始和结束下标。
- 计算搜索区间中间位置的索引
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);elseprintf("-1");return 0;
这篇关于查找------折半查找(二分查找)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!