2015-10-11 21:32:38 +00:00
|
|
|
package search
|
2015-10-11 18:55:50 +00:00
|
|
|
|
|
|
|
// BinarySearch is an implementation of binary search algorithm.
|
|
|
|
// Wikipedia: https://en.wikipedia.org/wiki/Binary_search_algorithm
|
|
|
|
//
|
|
|
|
// The binary search algorithm begins by comparing the target value to the value
|
|
|
|
// of the middle element of the sorted array. If the target value is equal to
|
|
|
|
// the middle element's value, then the position is returned and the search is
|
|
|
|
// finished. If the target value is less than the middle element's value, then
|
|
|
|
// the search continues on the lower half of the array; or if the target value
|
|
|
|
// is greater than the middle element's value, then the search continues on the
|
|
|
|
// upper half of the array. This process continues, eliminating half of the
|
|
|
|
// elements, and comparing the target value to the value of the middle element
|
|
|
|
// of the remaining elements - until the target value is either found (and its
|
|
|
|
// associated element position is returned), or until the entire array has been
|
|
|
|
// searched (and "not found" is returned).
|
|
|
|
func BinarySearch(haystack []int, needle int) (pos int, ok bool) {
|
|
|
|
if len(haystack) == 0 {
|
|
|
|
return 0, false
|
|
|
|
}
|
|
|
|
if haystack[0] > needle {
|
|
|
|
return 0, false
|
|
|
|
}
|
|
|
|
if haystack[len(haystack)-1] < needle {
|
|
|
|
return 0, false
|
|
|
|
}
|
|
|
|
|
|
|
|
first := 0
|
|
|
|
last := len(haystack)
|
|
|
|
for first < last {
|
|
|
|
mid := first + (last-first)/2
|
|
|
|
|
|
|
|
if haystack[mid] == needle {
|
|
|
|
return mid, true
|
|
|
|
} else if haystack[mid] > needle {
|
|
|
|
last = mid
|
|
|
|
} else {
|
|
|
|
first = mid + 1
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0, false
|
|
|
|
}
|