首页 > 其他 > 详细

二分查找和插值查找

时间:2020-01-09 21:45:39      阅读:56      评论:0      收藏:0      [点我收藏+]

数据均匀用插值,不均匀用二分,否则和线性查找差不多

public class InterpolationSearch {

	public static void main(String[] args) {
		
		int[] arr = {0,1,2,3,4,5,6,7,8,9,1000000000};
		int index = binarySearch(arr, 0, arr.length - 1, 6);//调用3次
//		int index = interPolationSearch(arr, 0, arr.length - 1, 6);//调用7次
		System.out.println(index);
	}
	
	
	//插值查找
	public static int interPolationSearch(int[] arr, int left, int right, int findValue) {
		System.out.println("调用插值查找~~");
		//防止越界
		if(left > right || findValue < arr[left] || findValue > arr[right]) {
			return -1;
		}
		
		//由于取整的关系, a*b/c 不等于 a/c*b
		int mid = left + (right - left) * (findValue - arr[left]) / (arr[right] - arr[left]);
		int midVal = arr[mid];
		if(findValue > midVal) {
			return interPolationSearch(arr, mid + 1, right, findValue);
		}else if(findValue < midVal) {
			return interPolationSearch(arr, left, mid - 1, findValue);
		}else {
			return mid;
		}
	}
	
	//二分查找
	public static int binarySearch(int[] arr, int left, int right, int findVal) {
		System.out.println("调用二分查找~~");
		if(left > right) {
			return -1;
		}
		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 {
			return mid;
		}
	}

}

  

二分查找和插值查找

原文:https://www.cnblogs.com/noyouth/p/12172625.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!