算法 C语言实现—折半查找(二分查找)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
-
目录
文章目录
前言
一、算法原理
二、算法实现
三、 算法特性
四、关键要点
4.1 防止整数溢出
4.2 边界条件
4.3 前提条件
前言
折半查找,也称为二分查找,是一种在有序数组中查找特定元素的高效算法。它的基本思想是通过不断将搜索区间减半来快速定位目标元素。
一、算法原理
取数组中间元素与查找元素进行比较,如果相等,则查找成功;如果查找元素比中间元素大,则在中间元素右边的数组查找;如果查找元素比中间元素小,则在中间元素的左边数组查找。然后不断重复上述过程,直到查找成功。
例如以数组arr[10]={1,2,3,4,5,6,7,8,9,10}为例查找目标元素7

二、算法实现
现在知道了折半查找的算法原理后,我们用C语言来代码实现,如下:
#include <stdio.h>int binary_search_iterative(int arr[], int n, int target) { //arr[] 数组 //target 查找的目标元素int left = 0; //左下标 // 初始化搜索区间的左边界 //n 元素个数int right = n - 1; //右下标 // 初始化搜索区间的右边界// 当搜索区间有效时继续查找(左边界不超过右边界)while (left <= right) {// 计算中间位置,使用 left + (right - left)/2 防止整数溢出int mid = left + (right - left) / 2; // 防止溢出// 检查中间元素是否等于目标值if (arr[mid] == target) {return mid; // 找到目标值,返回其索引}// 如果中间元素小于目标值,说明目标值在右半部分else if (arr[mid] < target) {left = mid + 1; // 调整左边界,在右半部分继续查找}// 如果中间元素大于目标值,说明目标值在左半部分else {right = mid - 1; // 调整右边界,在左半部分继续查找}}return -1; // 未找到目标值,返回-1
}
int main() {int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int n = sizeof(arr) / sizeof(arr[0]);int find = 7;if (binary_search_iterative(arr, n, find)) {printf("找到了!\n");}return 0;
}
三、 算法特性
时间度:O(log₂n)
空间复杂度: O(1)
四、关键要点
4.1 防止整数溢出
// 不推荐:当数组非常大的时候可能会溢出,数组小的时候可以使用
int mid = (left + right) / 2;// 推荐:防止溢出
int mid = left + (right - left) / 2;
4.2 边界条件
循环条件:left <= right(左闭右闭区间)
更新边界:left = mid + 1 和 right = mid - 1
4.3 前提条件
数组必须有序,否则算法无法正常工作
