1. 程式人生 > 其它 >二分查詢法(Go語言)

二分查詢法(Go語言)

技術標籤:資料結構與演算法

二分查詢法,在一個有序的數列裡,把中間元素v與查詢元素target相比較:

  • 若相等則返回
  • 若大於target則在v的右端繼續使用二分查詢法
  • 若小於target則在v的左端繼續使用二分查詢法

在這裡插入圖片描述
二分查詢法-迭代法(Go語言)

package main

import "fmt"

//二分查詢(前提必須在有序的數組裡,查詢target)
//如果找到target,返回相應的索引index
//如果沒有找到target,返回-1
//時間複雜度O(logN)

func binarySearch(arr *[]int, target int, l int, r int
) int { //在arr[l...r]中查詢target for l <= r { //middleIndex := r+l/2 //注意:這裡容易產生bug(r+l溢位int最大值),改寫成如下方式 middleIndex := l + (r-l)/2 if (*arr)[middleIndex] == target { return middleIndex }else if (*arr)[middleIndex] > target { //在arr[l...middleIndex - 1]中查詢target r = middleIndex - 1 }else
{ //在arr[middleIndex + 1...r]中查詢target l = middleIndex + 1 } } return -1 } func main() { arr := []int{1,2,5,8,11,13} index := binarySearch(&arr, 11,0, len(arr)-1) fmt.Println(index) }

輸出:

4

二分查詢法-遞迴法(Go語言):

package main

import "fmt"

//二分查詢(前提必須在有序的數組裡,查詢target)
//如果找到target,返回相應的索引index
//如果沒有找到target,返回-1 //時間複雜度O(logN) func binarySearch(arr *[]int, target int, l int, r int) int { //在arr[l...r]中查詢target for l <= r { //middleIndex := r+l/2 //注意:這裡容易產生bug(r+l溢位int最大值),改寫成如下方式 middleIndex := l + (r-l)/2 if (*arr)[middleIndex] == target { return middleIndex }else if (*arr)[middleIndex] > target { //在arr[l...middleIndex - 1]中查詢target return binarySearch(arr, target, l, middleIndex - 1) }else { //在arr[middleIndex + 1...r]中查詢target return binarySearch(arr, target, middleIndex + 1, r) } } return -1 } func main() { arr := []int{1,2,5,8,11,13} index := binarySearch(&arr, 11,0, len(arr)-1) fmt.Println(index) }

輸出:

4

時間複雜度O(logN),遞迴法的效能比迭代法的略差。