📜  C |回路和控制结构|问题20(1)

📅  最后修改于: 2023-12-03 15:29:43.677000             🧑  作者: Mango

C语言编程问题:回路和控制结构问题20
问题描述

编写一个程序,用二进制查找算法查找数组中的元素。如果找到元素,输出其下标;否则,输出提示信息表示未找到。

解题思路

二进制查找算法,也称折半查找算法,基于有序数组中值的不断二分为基础,时间复杂度为O(log n)。首先,检查数组的中间元素。如果需要查找的元素小于这个值,则进一步搜索左侧的子数组;如果需要查找的元素大于这个值,则进一步搜索右侧的子数组。不断重复这个过程,直到找到需要查找的元素或者直到搜索整个数组。

解题步骤
  1. 声明数组并初始化有序元素;
  2. 定义变量 lowhigh 分别表示搜索区间的开始和结束位置;
  3. 在区间范围内,循环执行二分查找,直到查找到目标值或者未找到目标值为止;
  4. 如果查找到目标值,输出其下标;否则,输出未找到提示信息;
  5. 完成查找算法实现。
代码实现
#include <stdio.h>

int binary_search(int arr[], int n, int target) {
    int low = 0, high = n-1, mid;
    while (low <= high) {
        mid = (low + high) / 2;
        // 如果查找到目标值,返回其下标
        if (arr[mid] == target) {
            return mid;
        }
        // 如果目标值小于当前中间值,向左搜索子数组
        else if (arr[mid] > target) {
            high = mid - 1;
        }
        // 如果目标值大于当前中间值,向右搜索子数组
        else {
            low = mid + 1;
        }
    }
    // 未找到目标值,返回 -1
    return -1;
}

int main() {
    int arr[] = {1, 2, 4, 6, 8, 10, 12};
    int n = sizeof(arr) / sizeof(int);
    int target = 8;
    int idx = binary_search(arr, n, target);
    if (idx == -1) {
        printf("未找到 %d\n", target);
    }
    else {
        printf("%d 的下标为 %d\n", target, idx);
    }
    return 0;
}
总结

二进制查找算法是一种高效的搜索算法,对于有序数组来说,相比于线性搜索算法可以减少搜索时间,提高搜索效率。可以使用递归或迭代方式实现,需要注意边界情况和收敛条件的判断。