[Algorithm]二分法查找算法

版权声明:本文为博主原创文章,转载请注明 http://blog.csdn.net/u012741077 https://blog.csdn.net/u012741077/article/details/52761444

简介

二分法查找(Binary Search)又称为折半查找(Half-Interval Search),是一种针对有序数列的查找方法

时间复杂度

每次把搜索区域减少一半
最差: O(logn)
最优: O(1)

空间复杂度

迭代: O(1)
递归: O(logn)

工作原理如下:

  • 判断查找范围最大值与最小值是否相等:
    • 如果相等,则取查找范围下标的中间值,并与所需要的查找的值进行比较:
      • 如果等于,则该中间值的下标就是所要查找的值的下标,即找到该值并返回下标。
      • 如果大于,则需要查找的值在中间值的左边,将查找范围最大值设置为中间值,然后重复第一个步骤。
      • 如果小于,则需要查找的值在中间值的右边,将查找范围最小值设置为中间值,然后重复第一个步骤。
    • 如果不相等,即未查找到所需要查找的值并返回-1或错误码。

这里写图片描述

C++实现

#include <stdio.h>

//非递归实现
int BinarySearch(int numbers[], int length, int value)
{
    int begin = 0;
    int end = length - 1;
    int mid = 0;

    while (begin < end)//当没有可查询的元素时退出
    {
        mid = (begin + end) / 2;//平分数组

        if (numbers[mid] == value)
        {
            return mid;//查找到返回下标
        }
        else if (numbers[mid] > value)
        {
            end = mid;//需要查找到的数在左边
        }
        else
        {
            begin = mid;//需要查找到的数在右边
        }
    }

    return -1;
}

//递归实现
int BinarySearchRecursively(int numbers[], int begin, int end, int value)
{
    if (begin >= end)//当没有可查询的元素时退出
    {
        return -1;
    }

    int mid =  (begin + end) / 2;//平分数组

    if (numbers[mid] == value)
    {
        return mid;//查找到返回下标
    }
    else if (numbers[mid] > value)
    {
        end = mid;//需要查找到的数在左边
    }
    else
    {
        begin = mid;//需要查找到的数在右边
    }

    return BinarySearchRecursively(numbers, begin, end, value);//继续递归
}

void main()
{
    int numbers[] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20 };

    int value = 17;
    printf("Index1 = %d\n", BinarySearch(numbers, 20, value));
    printf("Index2 = %d\n", BinarySearchRecursively(numbers, 0, 19, value));
}

这里写图片描述

猜你喜欢

转载自blog.csdn.net/u012741077/article/details/52761444