二分(拆半)查找是一种在有序数组中快速查找目标值的高效算法。它通过不断将搜索范围减半来实现:首先与数组中间元素比较,如果目标值等于中间元素则找到;如果目标值较小,则在左半部分继续查找;如果目标值较大,则在右半部分继续查找。如此重复,直到找到目标值或搜索范围为空。
1. C/C++版代码:
#include <stdio.h>
// 二分查找函数
int binarySearch(int arr[], int size, int target)
{
int left = 0;
int right = size - 1;
while (left <= right)
{
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
}
2. Java版代码:
import java.util.Scanner;
public class Main {
// 二分查找函数
public static int binarySearch(int[] arr, int size, int target) {
int left = 0;
int right = size - 1;
while (left <= right) {
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
}
public static void main(String[] args) {
int r;
int[] a = {12, 34, 35, 54, 85, 167, 265, 343, 399, 584};
r = binarySearch(a, 10, 584);
System.out.println(r);
}
}
3. Python版代码:
def binary_search(arr, size, target): left = 0 right = size - 1 while left <= right: mid = left + (right - left) // 2 # 防止溢出 if arr[mid] == target: return mid # 找到目标值,返回索引 elif arr[mid] < target: left = mid + 1 # 向右半部分继续查找 else: right = mid - 1 # 向左半部分继续查找 return -1 # 如果未找到目标值,返回-1 if __name__ == "__main__": a = [12, 34, 35, 54, 85, 167, 265, 343, 399, 584] r = binary_search(a, len(a), 265) print(r)
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程