二分查找_递归版_while版

本文介绍了一个简单的二分查找算法实现过程,通过C语言代码展示了如何在一个有序数组中搜索特定元素的位置。用户可以输入待查找的数字,程序将返回该数字在数组中的位置或未找到的提示。


#include <stdio.h>


int binary_search(const int arr[],int low, int high,int key);


int main(int argc, char **argv)

{

    

    int arr[] = {4,8,20,30,50,60};

    

    int len = sizeof(arr) / sizeof *arr;  // 求数组长度

    int key;

    printf("请输入一个数字:");

    scanf("%d",&key);

    printf("\n");

    

    int low = 0;

    int high = len - 1;

  

    int pos = binary_search(arr,low,high,key);  

    printf ("pos = %d\n",pos);    

    return 0;

}


int binary_search(const int arr[],int low, int high,int key)

{

    int mind = low + (high - low)/2;   // 记录中间 角标

    

    while (low <= high) {

        

        if (key == arr[mind]) {

            

            return mind;

            

        }

        else if(key > arr[mind]){

            

            low = mind + 1;

            mind = low + (high - low)/2;

            

        }

        else if(key < arr[mind]){

            

            high = mind - 1;

            mind = low + (high - low)/2;

            

        }

if(low>high){        

            return -1;     

        }

        

    }

    

    return -1;

       

}



### Python实现二分查找递归本 #### 非递归本的二分查找算法 二分查找是一种高效的查找算法,适用于有序数组。它的基本思想是通过不断缩小搜索区间来减少比较次数。以下是基于迭代方式(即非递归)实现的二分查找算法。 ```python def binary_search_iterative(nums, target): """ 使用迭代法实现二分查找。 参数: nums (List[int]): 已排序的整数列表。 target (int): 待查找的目标值。 返回: int: 若找到目标值,则返回其索引;否则返回 -1。 """ if not nums: # 如果输入列表为空,直接返回 -1 return -1 left, right = 0, len(nums) - 1 # 初始化左右指针 while left <= right: # 当左边界小于等于右边界时继续循环 mid = (left + right) // 2 # 计算中间位置 if nums[mid] == target: # 找到目标值 return mid elif nums[mid] < target: # 目标值大于中间值,在右侧子数组中继续查找 left = mid + 1 else: # 目标值小于中间值,在左侧子数组中继续查找 right = mid - 1 return -1 # 查找失败,返回 -1表示未找到目标值 ``` 此代码实现了二分查找的非递归形式。它通过两个变量 `left` 和 `right` 来维护当前搜索区间的两端,并逐步调整这两个变量直到定位目标值或确认目标值不存在[^4]。 --- #### 算法详解 1. **初始化**: 设定初始搜索范围为整个数组,其中 `left` 指向起始位置,`right` 指向结束位置。 2. **计算中间位置**: 在每次循环中,计算当前搜索区间的中间位置 `mid`。 3. **判断条件**: - 如果 `nums[mid]` 等于目标值 `target`,则立即返回该索引。 - 如果 `nums[mid]` 小于目标值,则更新 `left` 为 `mid + 1`,从而将搜索范围限定在右半部分。 - 否则,更新 `right` 为 `mid - 1`,将搜索范围限定在左半部分。 4. **终止条件**: 当 `left > right` 时,表明已无有效搜索空间,此时返回 `-1` 表示未找到目标值。 这种实现方式的时间复杂度为 \(O(\log n)\),因为每一步都将搜索范围减半。空间复杂度为 \(O(1)\),因为它仅使用常量级额外存储。 --- #### 测试案例 以下是一些测试用例及其预期结果: ```python # 测试用例 1: 正常情况 print(binary_search_iterative([1, 3, 6, 9, 10, 20, 30], 10)) # 输出: 4 # 测试用例 2: 目标值不在数组中 print(binary_search_iterative([1, 3, 6, 9, 10, 20, 30], 5)) # 输出: -1 # 测试用例 3: 数组只有一个元素 print(binary_search_iterative([10], 10)) # 输出: 0 print(binary_search_iterative([10], 20)) # 输出: -1 # 测试用例 4: 空数组 print(binary_search_iterative([], 10)) # 输出: -1 ``` 以上测试验证了不同场景下的正确性和鲁棒性。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值