二分查找法
二分查找法的核心思想
关键词: 等分
首先需要对数据进行排序,然后将数据进行等分
,接着对比中间值来判断数据处于哪个区间,不停地进行缩小范围查找数据。
代码实现
func BinarySearch(arr []int, data int) int {
low := 0
high := len(arr) - 1
i := 0
//循环的终止条件
for low <= high {
i++
fmt.Println("第", i, "次")
// 初始化枢轴
mid := (low + high) / 2
if arr[mid] > data {
high = mid - 1
} else if arr[mid] < data {
low = mid + 1
} else {
return mid
}
}
return -1
}
// 二分查找法(查找第一个)
func BinarySearchV2(arr []int, data int) int {
// 初始化起始坐标、结束坐标
low := 0
high := len(arr) - 1
// 初始化返回索引
index := -1
i := 0
//循环的终止条件
for low <= high {
i++
fmt.Println("第", i, "次")
// 初始化枢轴
mid := (low + high) / 2
if arr[mid] > data {
high = mid - 1
} else if arr[mid] < data {
low = mid + 1
} else {
// 确保该值为第一次出现
if mid == 0 || arr[mid-1] != data {
index = mid
break
} else {
high = mid - 1
}
}
}
return index
}
// 二分查找法(查找最后一个)
func BinarySearchV3(arr []int, data int) int {
// 初始化起始坐标、结束坐标
low := 0
high := len(arr) - 1
// 初始化返回索引
index := -1
i := 0
//循环的终止条件
for low <= high {
i++
fmt.Println("第", i, "次")
// 初始化枢轴
mid := (low + high) / 2
if arr[mid] > data {
high = mid - 1
} else if arr[mid] < data {
low = mid + 1
} else {
// 确保该值为最后一次出现
if mid == len(arr)-1 || arr[mid+1] != data {
index = mid
break
} else {
low = mid + 1
}
}
}
return index
}
// 二分查找法(查找第一个大于等于指定值)
func BinarySearchV4(arr []int, data int) int {
// 初始化起始坐标、结束坐标
low := 0
high := len(arr) - 1
// 初始化返回索引
index := -1
i := 0
//循环的终止条件
for low <= high {
i++
fmt.Println("第", i, "次")
// 初始化枢轴
mid := (low + high) / 2
if arr[mid] < data {
low = mid + 1
} else {
// 确保该值为第一次出现
if mid == 0 || arr[mid-1] < data {
index = mid
break
} else {
high = mid - 1
}
}
}
return index
}
// 二分查找法(查找最后一个小于等于指定值)
func BinarySearchV5(arr []int, data int) int {
// 初始化起始坐标、结束坐标
low := 0
high := len(arr) - 1
// 初始化返回索引
index := -1
i := 0
//循环的终止条件
for low <= high {
i++
fmt.Println("第", i, "次")
// 初始化枢轴
mid := (low + high) / 2
if arr[mid] > data {
high = mid - 1
} else {
// 确保该值为最后一次出现
if mid == len(arr)-1 || arr[mid+1] > data {
index = mid
break
} else {
low = mid + 1
}
}
}
return index
}