Binary Search Algorithm - 二元搜尋法

Posted by Alan Zhan on Saturday, July 10, 2021

我們來玩猜數字遊戲,1 ~ 100 中的整數,你必須猜中我腦海中的數字,而且我們必須在最少的布數內猜到答案,那麼你會怎麼猜呢?

答案很簡單,你一定會從 50 開始猜,如果沒猜中的話,太高你就會從 25 開始猜,太低你就會從 75 開始猜,以此類推,你每次操作的過程,你都會從中剖一半來猜測,其實你所使用的就是 Binary Search。

概念

二元搜尋 (Binary Search):使用者個演算法之前,被搜尋的清單是需要先被排序過的,如果你要找的元素在清單內的話,二元搜尋會返回你該元素得位置編號,否則會回傳 -1 。

複雜度

  • 時間複雜度: O(log n)
  • 空間複雜度: O(1)

範例

Go

package main

import "fmt"

func binarySearch(list []int, target int) int {
    low := 0
    high := len(list) - 1
    for low <= high {
        mid := (low + high) / 2
        if list[mid] == target {
            return mid
        } else if list[mid] < target {
            low = mid + 1
        } else {
            high = mid - 1
        }
    }
    return -1
}

func main() {
    fmt.Println(binarySearch([]int{1, 2, 3, 4, 5}, 3)) // 2
    fmt.Println(binarySearch([]int{1, 2, 3, 4, 5}, 6)) // -1
}

C#

class Algorithm
{
    public static int binarySearch(int[] list, int target)
    {
        var low = 0;
        var high = list.Length - 1;
        while(low <= high)
        {
            var mid = (low + high) / 2;
            if (list[mid] == target) 
            {
                return mid;
            }

            if (list[mid] < target)
            {
                low = mid + 1;
            } 
            else
            {
                high = mid - 1;
            }
        }

        return -1;
    }

    public static void Main(String[] args)
    {
        Console.WriteLine(binarySearch(new int[] {1, 2, 3, 4, 5}, 3)); // 2
        Console.WriteLine(binarySearch(new int[] {1, 2, 3, 4, 5}, 6)); // -1
    }
}

歡迎到我的 Facebook Alan 的筆記本 留言,順手給我個讚吧!你的讚將成為我持續更新的動力,感謝你的閱讀,讓我們一起學習成為更好的自己。