进行递归二进制搜索

时间:2015-09-19 05:09:45

标签: algorithm go binary-search

我知道Go有一个包含搜索功能的sort包,但这是出于教育目的。我一直试图在Go中实现二进制搜索算法,但我还没有能够让它工作。

这是我的代码:

package main

import "fmt"

func BinarySearch(data []int, target int, low int, high int) (index int, found bool)  {
    mid := (high + low) / 2
    if low > high {
       index = -1
       found = false
    } else {
        if target < data[mid] {
            BinarySearch(data, target, low, mid - 1)
        } else if target > data[mid] {
            BinarySearch(data, target, mid + 1, high)
        } else if target == data[mid] {
           index = mid
           found = true
        } else {
           index = -1
           found = false
        }
   }
   return
}

func main() {
  data := []int {2, 4, 6, 8, 9, 11, 12, 24, 36, 37, 39, 41, 54, 55, 56,}
  index, found := BinarySearch(data, 8, 0, len(data) - 1)
  fmt.Println(index, found)
}

始终打印0 false。为什么呢?

3 个答案:

答案 0 :(得分:5)

二进制搜索的逻辑是合理的。唯一的问题是您忘记将每次递归调用的结果分配给indexfound

目前您有这些递归调用:

BinarySearch(data, target, low, mid - 1)
//...
BinarySearch(data, target, mid + 1, high)

您只需分配结果:

index, found = BinarySearch(data, target, low, mid - 1)
//...
index, found = BinarySearch(data, target, mid + 1, high)

答案 1 :(得分:1)

二进制搜索逻辑

  • 目标是在数组中搜索项目。
  • 获取数组的中间项。
  • 如果大于期望值=>第一项到最后一项。
  • 如果小于期望值=>中间项目到结束项目
  • 重复过程

我们使用递归或循环来实现。

使用递归进行二进制搜索

函数将包含一个数组,我们将在其中进行搜索。然后目标值等于我们要搜索的值。
lowIndex将指示我们开始搜索。
highIndex表示搜索的最后位置。
然后该函数返回我们要搜索的目标值的位置。
在参数中包含lowIndexhighIndex的原因是要搜索数组的子集。

func binarySearch(array []int, target int, lowIndex int, highIndex int) int {
    //specify condition to end the recursion
    if highIndex < lowIndex {
        return -1
    }
    // Define our middle index 
    mid := int((lowIndex + highIndex) / 2)
    if array[mid] > target {
        return binarySearch(array, target, lowIndex,mid)
    }else if array[mid] < target {
        return binarySearch(array, target,mid+1,highIndex)
    }else {
        return mid 
    }
}

使用循环进行二进制搜索

func iterbinarySearch(array []int, target int, lowIndex int, highIndex int) int {
    startIndex := lowIndex
    endIndex := highIndex

    var mid int

    for startIndex < endIndex {
        mid = int((lowIndex + highIndex) / 2)
        if array[mid] > target {
            return binarySearch(array, target, lowIndex, mid)
        } else if array[mid] < target {
            return binarySearch(array, target, mid+1, highIndex)
        } else {
            return mid
        }

    }
    return -1
}

答案 2 :(得分:0)

http://play.golang.org/p/BbL-y7pJMi

据我所知,工作得很好。