學習回顧算法(二分法查找)

二分法查找概述

二分法查找也稱爲折半查找,屬於有序查找算法。用給定值key先和中間結點的關鍵字比較,中間結點把線形表分成兩個字表,若相等則查找成功;若不相等,再根據key與該中間結點關鍵字的比較結果確定下一步查找哪個字表,這樣遞歸進行,直到查找到或查找結束髮現表中沒有這樣的結點。

前提條件
列表中元素必須是有序的,如果是無須的則需要進行排序操作。

二分查找示例
假如有一組數爲1,3,5,7,9,11,13,15要查找給定值5。設三個變量front、mid、end分別指向數據的上界、中界和下界,mid=(front+end)/2
1、開始領front=0(指向1),end=7(指向15),則mid=3(指向7)。因爲mid>key,故應在前半段中查找。
2、新的end=mid-1=2,而front=0不變,則新的mid=1(指向3)。此時key>mid。故確定應在後半段中查找。
3、新fron=mid+1=2,而end=2不變,則新的mid=2,這是key=mid,查找成功。

二分法查找算法分析

時間複雜度:
1、最壞取款查找最後一個元素:T(n) = O(logn)
2、最好的情況,就是要查找的元素在中間。O(1)1,

二分法查找算法實現

1、golang實現

package main

import (
    "fmt"
)

func BinarySearch(values []int, key int) int {
    if len(values) == 0 {
        return -1
    }
    front := 0
    end := len(values) - 1
    mid := (front + end) / 2

    for front < end && values[mid] != key {
        if values[mid] > key {
            end = mid - 1
        } else {
            front = mid + 1
        }
        mid = (front + end) / 2
    }

    if values[mid] == key {
        return mid
    }

    return -1
}

func main() {

    values := []int{1, 3, 5, 7, 9, 11, 13, 15}
    fmt.Println(values)
    index := BinarySearch(values, 5)
    fmt.Println(index)
    index = BinarySearch(values, 100)
    fmt.Println(index)
    return
}

結果:

[1 3 5 7 9 11 13 15]
2
-1
發佈了143 篇原創文章 · 獲贊 24 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章