📜  门| GATE-CS-2014-(Set-2) |第 42 题(1)

📅  最后修改于: 2023-12-03 14:58:28.878000             🧑  作者: Mango

题目介绍

本题是GATE-CS 2014 (Set-2)的第42题。

题目要求对已排序的整数数组进行二分查找。

代码实现

以下为Python代码实现:

def binary_search(arr, low, high, x):
    """在已排序的数组中进行二分查找"""
    if high >= low:
        mid = (high + low) // 2

        if arr[mid] == x:
            return mid

        elif arr[mid] > x:
            return binary_search(arr, low, mid - 1, x)

        else:
            return binary_search(arr, mid + 1, high, x)

    else:
        return -1


# 实例化一个已排序的数组
arr = [2, 3, 4, 10, 40]

# 查找10在数组中的位置
result = binary_search(arr, 0, len(arr) - 1, 10)

if result != -1:
    print(f"元素在数组中的索引为{result}")
else:
    print("元素不在数组中")

以下为C++代码实现:

#include <bits/stdc++.h>
using namespace std;

int binary_search(int arr[], int low, int high, int x)
{
    """在已排序的数组中进行二分查找"""
    if (high >= low) {
        int mid = low + (high - low) / 2;

        if (arr[mid] == x)
            return mid;

        if (arr[mid] > x)
            return binary_search(arr, low, mid - 1, x);

        return binary_search(arr, mid + 1, high, x);
    }
 
    return -1;
}

int main()
{
    int arr[] = { 2, 3, 4, 10, 40 };
    int n = sizeof(arr) / sizeof(arr[0]);
    int x = 10;
    int result = binary_search(arr, 0, n - 1, x);
    (result == -1) ? printf("元素不在数组中")
                   : printf("元素在数组中的索引为 %d",
                            result);
    return 0;
}

解析

二分查找是一种可通过将目标值与当前中间值进行比较并削减一半搜索空间来快速定位元素的算法。它的时间复杂度为O(logn),适用于已排序的数组。

该算法的基本思路为:将数组分成两半,并将目标值与当前中间值进行比较。如果目标值小于中间值,则继续在左半部分搜索,并将搜索范围缩小到左半边。如果目标值大于中间值,则在右半边继续搜索。如果目标值正好等于中间值,则直接返回中间值的索引。如果最终找不到目标值,则返回-1。

在此代码实现中,我们使用递归算法进行二分查找。我们将数组的低位指针和高位指针传递给函数,并在每次递归时将搜索范围缩小到前半部分或后半部分。我们继续执行该过程,直到找到目标值或搜索范围适当缩小时结束递归,返回-1。

结论

二分查找是一个快速定位元素的强大算法。由于其时间复杂度为O(logn),因此它在处理大型已排序数据集时非常有效。此外,该算法还有许多变体,可以用于查找最小元素或最大元素等等。