二分尋找法(Golang版本)

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

一組資料要進行二分尋找,那麼這個要尋找的元素是有序,並且是連續存放(數組)。這樣才可以進行二分尋找。

下面首先來建立一個檔案和數組

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}

二分尋找就完成了

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.