[查找算法]:二分查找

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
####################################### */


posted @ 2022-01-10 22:27  渝北小站  阅读(49)  评论(0)    收藏  举报