2020-08-20 09:28:35 +08:00
|
|
|
/*
|
|
|
|
|
* @Author : huangzj
|
|
|
|
|
* @Time : 2020/8/18 17:45
|
|
|
|
|
* @Description:二分查找法,对于有序数组进行查找
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
package search
|
|
|
|
|
|
|
|
|
|
func BinarySearch(list []int, value int) int {
|
|
|
|
|
low := 0
|
|
|
|
|
high := len(list) - 1
|
|
|
|
|
var mid int
|
|
|
|
|
|
|
|
|
|
for low <= high {
|
|
|
|
|
mid = (low + high) >> 1 //相当于(low + high) / 2
|
|
|
|
|
if value == list[mid] {
|
|
|
|
|
return mid
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if value < list[mid] {
|
|
|
|
|
high = mid - 1
|
|
|
|
|
} else {
|
|
|
|
|
low = mid + 1
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return -1
|
|
|
|
|
}
|
2021-02-05 14:47:59 +08:00
|
|
|
|
|
|
|
|
//二分查找在两个数值之间的数据
|
|
|
|
|
func BinarySearchBetween(list []int, value int) int {
|
|
|
|
|
low := 0
|
|
|
|
|
high := len(list) - 1
|
|
|
|
|
var mid int
|
|
|
|
|
|
|
|
|
|
for low <= high {
|
|
|
|
|
//求mid
|
|
|
|
|
mid = (low + high) >> 1
|
|
|
|
|
//要算后面一个元素,所以下标要判断是否超过 并且需要考虑超过数组最大值的情况
|
|
|
|
|
if (mid+1 < len(list) && value > list[mid] && value < list[mid+1]) || value == list[mid] || (mid+1 >= len(list) && value > list[mid]) {
|
|
|
|
|
return mid
|
|
|
|
|
}
|
|
|
|
|
//位移
|
|
|
|
|
if value < list[mid] {
|
|
|
|
|
high = mid - 1
|
|
|
|
|
} else {
|
|
|
|
|
low = mid + 1
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//未找到元素
|
|
|
|
|
return -1
|
|
|
|
|
}
|