這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
一組資料要進行二分尋找,那麼這個要尋找的元素是有序,並且是連續存放(數組)。這樣才可以進行二分尋找。
下面首先來建立一個檔案和數組
package mainimport ("fmt""math")type DataStruct struct {Data []int}func main() {a1 := DataStruct{[]int{1, 2, 5, 7, 15, 25, 30, 36, 39, 51, 67, 78, 80, 82, 85, 91, 92, 97}}fmt.Println(a1)}
數組a1是一個從小到大的有序數組,總共有18個元素
假設說我要尋找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次,大大減少了執行時間
下面來寫一個尋找的方法
func (d *DataStruct) Find(k int) int {left, right, mid := 1, len(d.Data), 0for { // mid向下取整mid = int(math.Floor(float64((left + right) / 2)))if d.Data[mid] > k { // 如果當前元素大於k,那麼把right指標移到mid - 1的位置right = mid - 1} else if d.Data[mid] < k { // 如果當前元素小於k,那麼把left指標移到mid + 1的位置left = mid + 1} else { // 否則就是相等了,退出迴圈break} // 判斷如果left大於right,那麼這個元素是不存在的。返回-1並且退出迴圈if left > right {mid = -1break}} // 輸入元素的下標return mid}
接下來試一下這個方法,把剛才main改成這樣
func main() {a1 := DataStruct{[]int{1, 2, 5, 7, 15, 25, 30, 36, 39, 51, 67, 78, 80, 82, 85, 91, 92, 97}}fmt.Println(a1.Find(30)) //列印 6}
二分尋找就完成了