插值查找

一.简介

插值查找是根据查找关键字与查找表中最大、最小记录关键字比较后的查找方法。插值查找基于二分查找,将查找点的选择改进为自适应选择,提高查找效率。根据开始、结束索引、查找值提前预判查找值可能的位置。

二.实现

package com.vincent;


import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws Exception{

        int[] arr = new int[32];
        for(int i=0;i<arr.length;i++){
            arr[i] = (int)(Math.random() * 100);
        }
        System.out.println(Arrays.toString(arr));
        quickSort(arr,0,arr.length);
        System.out.println(Arrays.toString(arr));
        System.out.println(insertSearch(arr,0,arr.length,22));
    }

    public static void quickSort(int[] arr,int startIndex,int endIndex){
        int base = arr[startIndex];
        int left = startIndex,right=endIndex-1;
        while(left < right){
            while(left < right && arr[right] >= base){
                right--;
            }
            arr[left] = arr[right];

            while(left < right && arr[left] < base){
                left++;
            }
            arr[right] = arr[left];
        }
        arr[left] = base;
        if(left - startIndex > 1){
            quickSort(arr,startIndex,left);
        }
        if(endIndex - left > 1){
            quickSort(arr,left+1,endIndex);
        }
    }

   public static int insertSearch(int[] arr,int startIndex,int endIndex,int dst){
        //二分查找
        //int mid = (startIndex + endIndex)/2;
       //插值查找
        int mid = startIndex + (dst-arr[startIndex])*(endIndex-startIndex)/(arr[endIndex-1]-arr[startIndex]);
        if(mid>=endIndex || mid<startIndex){
            return -1;
        }
        if(arr[mid] == dst){
            return mid;
        }
        else if(arr[mid] < dst){
            return insertSearch(arr,mid+1,endIndex,dst);
        }
        else{
            return insertSearch(arr,startIndex,mid-1,dst);
        }
   }
}

效果:
在这里插入图片描述

三.总结

插值查找在二分查找基础上实现,通过预先判断查找数据的可能性提高数据查找效率。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值