二分查找法就是實現在一組有序的數字數組集合中最快找到指定元素的下標
思路
①先找到中間的下標middle = (leftIndex + RightIndex) /2 ,然后讓中間的下標值和FindVal比較
a:如果arr[middle] > FindVal,那么就向LeftIndex~(midlle - 1)區間找
b:如果arr[middle] < FindVal,那么就向middle + 1 ~RightIndex區間找
c:如果arr[middle] == FindVal,那么直接返回
②從①的a、b、c遞歸執行,知道找到位置
③如果LeftIndex > RightIndex,則表示找不到,退出
代碼/舉例
假設說我要查找30這個值,如果按照循環的查找方法,找到30這個值要執行7次。那么如果是按照二分查找呢?好吧,二分查找的過程如下:
1. left = 1, right = 18; mid = (1+18)/2 = 9; 51 > 30
2. left = 1, right = mid - 1 = 8; mid = (1+8)/2 = 4; 15 < 30
3. left = mid + 1 = 5, right = 8; mid = (5+8)/2 = 6; 30 = 30 查找完畢
只需要執行3次,大大減少了執行時間
//代碼
package main import ( "fmt" ) //二分查找函數 //假設有序數組的順序是從小到大(很關鍵,決定左右方向)
func BinaryFind(arr *[]int, leftIndex int , rightIndex int, findVal int) { //判斷leftIndex是否大於rightIndex
if leftIndex > rightIndex { fmt.Println("沒找到") return } //先找到中間的下標
middle := (leftIndex + rightIndex) / 2
if (*arr)[middle] > findVal { BinaryFind(arr, leftIndex, middle - 1, findVal) } else if (*arr)[middle] < findVal { BinaryFind(arr, middle + 1, rightIndex, findVal) } else { fmt.Printf("找到了,下標是%v\n", middle) } } func main() { //定義一個數組
arr := []int{1, 2, 5, 7, 15, 25, 30, 36, 39, 51, 67, 78, 80, 82, 85, 91, 92, 97} BinaryFind(&arr, 0, len(arr) - 1, 30) }
找到了,下標是6