[Algorithm]二分法查找算法

簡介

二分法查找(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));
}

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章