折半查找:
* 二分法查找:
* 思路:我们需要一个数组为顺序排序,起点设置为low,终点设置为high,每次查找它们的中点,那么这个数值存的值也是终点
* 如果要找的值比中点小就将high移到这个终点-1位置,相当于查找这部分
* 如果要找的值比中点大就将high移到这个终点+1位置,相当于查找这部分
* 如果中点的值等于要查的值结束
* 如果high或者low移动时移动到查找值,那么就会循环到low=high时查找完成
* 时间复杂度O[log以2为底的n]
差值查找法:
//将mid=(low+high)/2;这句话改为mid=low+((key-binary[low])/(a[high]-a[low]))*(high-low)这就是叫做插值查找法
//当分布较均匀时,用插值查找法较好,分布不均匀,比较极端的话用这种方法未必好
package binary;
import java.util.Scanner;
/*
* 二分法查找:
* 思路:我们需要一个数组为顺序排序,起点设置为low,终点设置为high,每次查找它们的中点,那么这个数值存的值也是终点
* 如果要找的值比中点小就将high移到这个终点-1位置,相当于查找这部分
* 如果要找的值比中点大就将high移到这个终点+1位置,相当于查找这部分
* 如果中点的值等于要查的值结束
* 如果high或者low移动时移动到查找值,那么就会循环到low=high时查找完成
* 时间复杂度O[log以2为底的n]
* */
public class Binary {
public static void main(String[] args) {
int[] bin = new int[]{0, 1, 16, 24, 35, 47, 59, 65, 73, 88, 99};//新建一个顺序存储的数组
int low, high, mid, key,tag=0;
low = 1;//定义最低点下标
high=10;//定义最高点下标
System.out.println("请输入要查找的值");
Scanner sc= new Scanner(System.in);
key=sc.nextInt();
while(low<=high){//循环进行查找,最坏情况就是当low=high时
mid=(low+high)/2;//先找到中值
if(key<bin[mid]) //第一种情况:当要查的点key小于中点
high=mid-1;//那么将high移动到小于中点这边数集进行查找,下一次对这边进行查找
else if (key>bin[mid])//第二种情况:当要查的点key大于中点
low=mid+1;//那么将low移动到大于中点这边数集进行查找,下一次对这边查找
else if (key == bin[mid]) {
System.out.println("找到了" + bin[mid]);
tag=1;
break;
}
}
if (tag == 0)
System.out.println("没找到你要找的值"+key);
}
}
//将mid=(low+high)/2;这句话改为mid=low+((key-binary[low])/(a[high]-a[low]))*(high-low)这就是叫做插值查找法
//当分布较均匀时,用插值查找法较好,分布不均匀,比较极端的话用这种方法未必好