详细注释------二分查找简单版(循环和递归)

二分查找

二分查找是对有序的数组进行高效查找的算法。一般是数组,因为支持随机访问,如果是用链表,那么就使用跳表结构,即在链表中加多级索引达到二分查找的结构

下面分别用循环和递归实现简单的二分查找,也就是没有重复数据的二分查找。虽然简单,但是还有有几个小坑的。

递归算法
private static int binarySearch(int[] a, int start, int end, int val) {
		//int index = (start + end)/2;//直接用取中间值的方法,可能会造成越界,因此,要使用下面的方法。
		//递归终止条件,两边到头都找不到
		if(end < start) //to avoid stack over flow
			return -1;
		//1. 用位运算符取代/2,计算效率更高
		//2. +-的优先级高于<< >> 所以要加()
		int index = start + (end - start>>2);//need to add () +- is priority to << >>
		
		if(a[index] == val) {
			return index;
		}else if(a[index] > val) {
			return binarySearch(a, start, index-1, val);
		}else {
			return binarySearch(a, index+1, end, val);
		}
	}
循环算法
private static int binarySearchLoop(int[] a ,int val) {
		// to find the index where value is val
		int mid = 0;
		int low = 0;
		int high = a.length-1;
		
		//这里是循环执行条件,递归那边是终止条件,所以是一致的
		while(low <= high) {
			mid = low + ((high - low) >> 2);
			if(a[mid] == val) {
				return mid;
			}
			else if(a[mid] < val) {
				low = mid+1;
			}
			else {
				high = mid-1;
			}
		}
		
		return -1;// no val in the array.
	}
对于基础算法,其实隔几个月重新写一次是有必要的,什么也不看,就自己根据原理写,隔得太近也没有必要,因为会背代码,不是理解的结果。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值