二分查找

二分查找法在算法家族大类中属于“分治法”,分治法基本都可以用递归来实现的,当然也可以使用非递归的方式实现。需要注意的是:如要使用二分查找,需满足以下条件:

  • 存储在数组中
  • 有序排列

线性查找和二分查找的动态对比:
在这里插入图片描述
递归实现(解决多个相同值返回多个索引):

public static List<Integer> binarySearch(int[] arr, int left, int right, int findVal) {
		System.out.println("hello~");
		// 当 left > right 时,说明递归整个数组,但是没有找到
		if (left > right) {
			return new ArrayList<Integer>();
		}
		int mid = (left + right) / 2;
		int midVal = arr[mid];
		if (findVal > midVal) { // 向右递归
			return binarySearch(arr, mid + 1, right, findVal);
		} else if (findVal < midVal) { //向左递归
			return binarySearch(arr, left, mid - 1, findVal);
		} else {
//			 * 1. 在找到mid索引值,不要马上返回
//			 * 2. 向mid索引值的左边扫描,将所有与当前值相等的值的元素的下标加入到集合ArrayList
//			 * 3. 向mid索引值的右边扫描,将所有与当前值相等的值的元素的下标加入到集合ArrayList
			List<Integer> resIndexlist = new ArrayList<Integer>();
			int temp = mid - 1;
			while(true) {
				if (temp < 0 || arr[temp] != findVal) {//退出
					break;
				}
				resIndexlist.add(temp);
				temp -= 1; 
			}
			resIndexlist.add(mid); 
			temp = mid + 1;
			while(true) {
				if (temp > arr.length - 1 || arr[temp] != findVal) {
					break;
				}
				resIndexlist.add(temp);
				temp += 1;
			}
			//在此数组的基础上,可以实现二分查找的变种,比如返回第一个相同值或最后一个相同值
			return resIndexlist;
		}
	}
发布了36 篇原创文章 · 获赞 1 · 访问量 791
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览