Go语言之简单算法的实现——查找算法

Go语言之简单算法的实现——查找算法

1. 二分查找算法

1.1 二分查找算法: 在指定切片(有序)中查找第一个大于给定值的元素索引
  • 递归实现
/**
 * 二分查找算法: 在指定切片(有序)中查找第一个大于给定值的元素索引
 * 递归实现
 * @Param: point []float32 指定的切片
 * @Param: v float32 给定的值
 * @Return: index int 查找符合条件的元素在切片中的索引
 */
func BinarySearchFirstGreaterByRecursive(point []float32, v float32) int {
	size := len(point)
	if size == 0 {
		// 切片长为空时返回 0
		return 0
	}
	return bsFirstGreaterByRecursive(point, v, 0, size-1)
}

/**
 * 二分查找算法的递归部分: 在指定切片(有序)中查找第一个大于给定值的元素索引
 * @Param: point []float32 指定的切片
 * @Param: v float32 给定的值
 * @Param: low, high int 查找的指定上下标
 * @Return: index int 查找符合条件的元素在切片中的索引
 */
func bsFirstGreaterByRecursive(point []float32, v float32, low, high int) int {
	if low == high && high != 0 {
		return high + 1
	}
	if low > high {
		// 下标大于上标
		return 0
	}
	mid := (low + high) / 2
	if point[mid] <= v && point[mid+1] >= v {
		return mid + 1
	} else if point[mid] < v {
		return bsFirstGreaterByRecursive(point, v, mid+1, high)
	} else {
		return bsFirstGreaterByRecursive(point, v, low, mid-1)
	}
}
1.2 二分查找算法: 在指定切片(有序)中查找等于给定值的元素索引
/**
 * 二分查找算法: 在指定切片(有序)中查找等于给定值的元素索引
 * 递归实现
 * @Param: point []float32 指定的切片
 * @Param: v float32 给定的值
 * @Return: index int 查找符合条件的元素在切片中的索引
 */
func BinarySearchEqualByRecursive(point []float32, v float32) int {
	size := len(point)
	if size == 0 {
		// 切片长为空时返回 -1
		return -1
	}
	return bsEqualByRecursive(point, v, 0, size-1)
}

/**
 * 二分查找算法的递归部分: 在指定切片(有序)中查找等于给定值的元素索引
 * @Param: point []float32 指定的切片
 * @Param: v float32 给定的值
 * @Param: low, high int 查找的指定上下标
 * @Return: index int 查找符合条件的元素在切片中的索引
 */
func bsEqualByRecursive(point []float32, v float32, low, high int) int {
	if low > high {
		// 下标大于上标
		return -1
	}
	mid := (low + high) / 2
	if point[mid] == v {
		return mid
	} else if point[mid] < v {
		return bsEqualByRecursive(point, v, mid+1, high)
	} else {
		return bsEqualByRecursive(point, v, low, mid-1)
	}
}

[Github源码地址] : https://github.com/NcuWen/Arithmetic

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值