数据结构与算法--折半查找(binary search)

本文深入解析了二分查找算法,介绍了其基本原理和应用场景,强调了待查找序列需有序的前提条件。通过C语言实现了一个示例程序,展示了如何进行有效的二分查找,包括输入目标值、查找过程和结果输出。

折半查找也叫二分查找,简单的理解就是每次只查找序列的一半,这样效率会很快,但是折半查找有个前提就是查找的序列必须是排好顺序的,不然没办法使用这个算法。

折半查找代码如下:

#include <stdio.h>

#define NOT_SEARCH  -1
#define ARRAY_LEN   10

int binary_search(int *array,int array_len,int target);

int main(void)
{
   int a[ARRAY_LEN] = {0,10,20,30,40,50,60,70,80,90};
   int search_num;
   int search_result;
   
   printf("请输入要查找的数:");
   scanf("%d",&search_num);
   
   search_result = binary_search(a,ARRAY_LEN,search_num);
   
   if(search_result > 0)
   {
       printf("找到该数,位于序列的第%d位。\n",search_result + 1);
   }
   else
   {
       printf("在该序列中找不到到该数!\n");
   }
   
   return 0;
}

int binary_search(int *array,int array_len,int target)
{
    int low,mid,high;
    
    low = 0;
    high = array_len - 1;
    
    while(low <= high)
    {
        mid = (low + high) / 2;
        
        if(target < array[mid])
        {
            high = mid - 1;
        }
        else if(target > array[mid])
        {
            low = mid + 1;
        }
        else 
        {
            return mid;
        }
    }
    return NOT_SEARCH;
} 

 

### 二分查找(折半查找算法详解 二分查找(Binary Search)是一种高效的查找算法,适用于**有序数组或列表**。它通过不断缩小查找范围来快速定位目标值。其核心思想是将目标值中间元素进行比较: - 如果目标值等于中间元素,则查找成功; - 如果目标值小于中间元素,则在左半部分继续查找; - 如果目标值于中间元素,则在右半部分继续查找。 这个过程重复进行,直到找到目标值或者查找区间为空为止。 #### 时间复杂度 二分查找的时间复杂度为 **O(log n)**,这使得它比线性查找(O(n))更加高效,尤其是在处理规模数据时[^1]。 --- ### 二分查找的实现方式 #### 递归实现 以下是一个使用 **C++** 的递归实现示例: ```cpp #include <iostream> using namespace std; int BinarySearch(int* arr, int minSub, int maxSub, int num) { if (minSub > maxSub) return -1; // 查找失败 int mid = (minSub + maxSub) / 2; // 计算中间索引 if (num == arr[mid]) { return mid; // 找到目标值 } else if (num < arr[mid]) { return BinarySearch(arr, minSub, mid - 1, num); // 在左半部分查找 } else { return BinarySearch(arr, mid + 1, maxSub, num); // 在右半部分查找 } } int main() { int number[] = {5, 7, 11, 15, 19, 21, 25, 26, 61, 99}; int index = BinarySearch(number, 0, 9, 26); if (index == -1) { cout << "数字不存在" << endl; } else { cout << "数字26是数组下标的:" << index << endl; } return 0; } ``` #### 非递归实现 以下是使用 **Python** 的非递归实现示例: ```python def binary_search(alist, item): first = 0 last = len(alist) - 1 while first <= last: midpoint = (first + last) // 2 if alist[midpoint] == item: return True elif item < alist[midpoint]: last = midpoint - 1 else: first = midpoint + 1 return False testlist = [0, 1, 2, 8, 13, 17, 19, 32, 42] print(binary_search(testlist, 3)) # 输出: False print(binary_search(testlist, 13)) # 输出: True ``` --- ### 变种应用 除了基本的查找功能外,二分查找还可以用于解决更复杂的问题,例如: 1. **查找插入位置**:当目标值不在数组中时,可以返回其应该插入的位置以保持数组有序。 2. **查找区间边界**:可以用于查找某个值的起始和结束位置,尤其适用于包含重复元素的有序数组--- ### 注意事项 - **输入必须有序**:二分查找的前提是数据集合必须是有序的,否则无法保证正确性。 - **边界条件处理**:在编写代码时,需要注意处理边界条件,如空数组、单个元素等。 - **避免死循环**:在非递归实现中,需要确保循环能够正常退出,防止出现死循环。 --- ### 总结 二分查找是一种基础但非常重要的算法,广泛应用于各种编程语言和实际开发场景中。掌握其原理和实现方式对于提升算法思维和编程能力至关重要[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值