查找之折半查找插值查找

折半查找:

* 二分法查找:
* 思路:我们需要一个数组为顺序排序,起点设置为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)这就是叫做插值查找法
//当分布较均匀时,用插值查找法较好,分布不均匀,比较极端的话用这种方法未必好

猜你喜欢

转载自blog.csdn.net/sunmeok/article/details/80805722