查找-插值查找InsertValueSearch

一、插值查找简介

插值查找,有序表的一种查找方式。插值查找是根据查找关键字与查找表中最大最小记录关键字比较后的查找方法。插值查找基于二分查找,将查找点的选择改进为自适应选择,提高查找效率。

原理分析
1)插值查找每次从自适应mid处开始查找
2)将折半查找中的求mid索引的公式,low表示左边索引,high表示右边索引
int mid =(low+high)/2= low + (high- low) /2 改为
int mid = low + (high- low) * (findValue- arr[low])/ (arr[high] - arr[low]);
3)其他同二分查找一样!

适用条件
适合于关键字值分布均匀的集合。

二、代码实现

从有序数组1-100中查找,若查找成功,返回索引;

package search;



public class InsertValueSearchTest {
    public static void main(String[] args) {
        //定义一个分布均匀的数组
        int[] arr = new int[100];
        for (int i=0;i<arr.length;i++){
            arr[i] = i+1;
        }

        int findIndex = InsertValueSearch(arr, 0, arr.length - 1, 101);
        if (findIndex != -1){
            System.out.println("查找成功,返回索引findIndex ="+findIndex);
        }else{
            System.out.println("查找失败,数组中没有这个数!!");
        }


    }

    public static int InsertValueSearch(int[] arr, int low, int high, int findValue) {
        //low > high时,遍历完数组没有找到,此时必须加上两头判断,防止下标越界
        if (low > high || findValue > arr[high] || findValue < arr[low]){
            return -1;
        }

        int mid = low +(high -low)*(findValue -arr[low])/(arr[high]-arr[low]);//按比例查找定义中间值的索引
        int midValue = arr[mid];//中间值


        if (findValue > midValue){
            return InsertValueSearch(arr,mid+1,high,findValue);
        }else if (findValue < midValue){
            return InsertValueSearch(arr,low,mid-1,findValue);
        }else {
            return mid;
        }

    }
}

截图

查找101
在这里插入图片描述
查找55
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值