[查找算法]:二分查找
python 和 golang 实现 binary search
二分查找:按照折半的方法,每次取列表(有序)的中间元素,与待查找的值进行对比。如果恰好相等则返回那个元素的下标,如果列表中间元素不等于待查找的元素,则根据大小情况,和列表的顺序情况,对应缩小列表的待查找区域。直到待查找区域不再含有元素,则表示没查到,返回-1
> python
def binary_search_up(data_list, value):
""" 升序版 """
left = 0
right = len(data_list) - 1
mid = (left + right) // 2
while left <= right:
if data_list[mid] == value:
break
elif data_list[mid] > value: # 说明待查找值在左边
left = left
right = mid - 1
mid = (left + right) // 2
else: # 说明待查找值在右边
left = mid + 1
right = right
mid = (left + right) // 2
else:
# while-else结构,while正常退出(非break)时将执行一次else语句块。这里也就是没有查到
return -1
# while因break退出时,不会执行else语句块。这里就是查到了
return mid
# 本例中的代码只适用于升序排列的情况
temp = [273, 21, 31, 7, 9, 0, 93, -12, 3]
temp.sort()
print(temp)
binary_search_up(temp, 21)
# [运行结果如下]:#####################
"""
[-12, 0, 3, 7, 9, 21, 31, 93, 273]
5
"""
# ####################################
def binary_search_down(data_list, value):
""" 降序版 """
left = 0
right = len(data_list) - 1
while left <= right:
mid = (left + right) // 2
if data_list[mid] > value: # 说明待查找值在右边
left = mid + 1
right = right
elif data_list[mid] < value: # 说明待查找值在左边
left = left
right = mid - 1
else:
return mid
else:
return -1
# 本例的代码只适用于降序
temp = [273, 21, 31, 7, 9, 0, 93, -12, 3]
temp.sort(reverse=True)
print(temp)
binary_search_down(temp, 21)
# [运行结果如下]:#####################
"""
[273, 93, 31, 21, 9, 7, 3, 0, -12]
3
"""
# ####################################
> golang
package main
import (
"fmt"
"sort"
)
func BinarySearchUp(datalist []int, value int) (index int) {
// 升序版
left := 0
right := len(datalist) - 1
for left <= right {
// golang是强类型语言,int 数据类型的 / 即为整除
mid := (left + right) / 2
if datalist[mid] > value {
// 说明待查找值在左边
left = left
right = mid - 1
} else if datalist[mid] < value {
// 说明待查找值在右边
left = mid + 1
right = right
} else {
// 说明找到了
return mid
}
}
// 说明没找到
return -1
}
func main() {
// 定义一个切片类型
temp := []int{273, 21, 31, 7, 9, 0, 93, -12, 3}
// 排序
sort.Ints(temp)
// 打印排序后的数据
for _, value := range temp {
fmt.Printf("%d ", value)
}
// 查找
num := BinarySearchUp(temp, 21)
// 打印结果
fmt.Printf("\nindex=%d", num)
}
/* [运行结果如下]:########################
-12 0 3 7 9 21 31 93 273
index=5
####################################### */
本文来自博客园,作者:渝北小站,转载请注明原文链接:https://www.cnblogs.com/timgunt/p/15786336.html

浙公网安备 33010602011771号