二分(拆半)查找是一种在有序数组中快速查找目标值的高效算法。它通过不断将搜索范围减半来实现:首先与数组中间元素比较,如果目标值等于中间元素则找到;如果目标值较小,则在左半部分继续查找;如果目标值较大,则在右半部分继续查找。如此重复,直到找到目标值或搜索范围为空。

 

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)
点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)