二分查找也稱折半查找(Binary Search),它是一種效率較高的查找方法。可是,折半查找要求線性表必須採用順序存儲結構,並且表中元素按關鍵字有序排列算法
查找過程:數組
首先,假設表中元素是按升序排列,將表中間位置記錄的關鍵字與查找關鍵字比較,若是二者相等,則查找成功;不然利用中間位置記錄將表分紅前、後兩個子表,若是中間位置記錄的關鍵字大於查找關鍵字,則進一步查找前一子表,不然進一步查找後一子表。重複以上過程,直到找到知足條件的記錄,使查找成功,或直到子表不存在爲止,此時查找不成功。bash
算法要求:ide
1.必須採用順序存儲結構。函數
2.必須按關鍵字大小有序排列。spa
要求:blog
請對一個有序數組進行二分查找 {1,8, 10, 89, 1000, 1234} ,輸入一個數看看該數組是否存 在此數,而且求出下標,若是沒有就 示"沒有這個數"。【會使用到遞歸】排序
/二分查找的函數
/*
二分查找的思路: 好比咱們要查找的數是 findVal
1. arr 是一個有序數組,而且是從小到大排序
2. 先找到 中間的下標 middle = (leftIndex + rightIndex) / 2, 而後讓 中間下標的值和 findVal 進行遞歸
比較it
2.1 若是 arr[middle] > findVal , 就應該向 leftIndex ---- (middle - 1)
2.2 若是 arr[middle] < findVal , 就應該向 middel+1---- rightIndex
2.3 若是 arr[middle] == findVal , 就找到
2.4 上面的 2.1 2.2 2.3 的邏輯會遞歸執行
3. 想一下,怎麼樣的狀況下,就說明找不到[分析出退出遞歸的條件!!] if leftIndex > rightIndex {
// 找不到..
return .. }
*/
package main import "fmt" func BinarySearch(arr *[6]int,leftIndex int,rightIndex int ,findVal int ){ if leftIndex > rightIndex{ fmt.Printf("%v中找不到\t元素%v\n",(*arr),findVal) return } //先找到中間下標 midddle := (leftIndex+rightIndex)/2 if (*arr)[midddle] >findVal { //說明要查找的數在左邊 就應該向 leftIndex ---- (middle - 1)再次查找 BinarySearch(arr,leftIndex,midddle-1,findVal) }else if (*arr)[midddle] < findVal{ //若是 arr[middle] < findVal , 就應該向 middel+1---- rightIndex BinarySearch(arr,midddle+1,rightIndex,findVal) }else { //找到了 fmt.Printf("%v中找到元素%v,下標爲%v\n",(*arr),findVal,midddle) } } func main() { ArraryNum := [6]int{1,8, 10, 89, 1000, 1234} ArraryNum2 := [6]int{8,200, 300, 889, 1000, 1234} BinarySearch(&ArraryNum,0,len(ArraryNum),1234) BinarySearch(&ArraryNum2,0,len(ArraryNum),300) BinarySearch(&ArraryNum,0,len(ArraryNum),-8) BinarySearch(&ArraryNum2,0,len(ArraryNum),30) } //結果