Java基础查找算法(3)——插值查找(插入查找)

Java基础查找算法(3)——插值查找(插入查找)

1.插值排序简述

插值查找,又称插入查找,与二分查找类似,需要所查数组已经有序,只是对mid下标的选取有所不同而已。

Java基础查找算法(2)——二分查找(折半查找)

二分查找中 mid下标的选取公式:mid=(left+right)/2

插值查找中 mid下标的选取公式:mid=left+(target-a[left])* (right-left) /(arr[right]-arr[left])

2.插值排序使用场景

  • 数据量大且数组元素比较均匀时,插值查找效率>二分查找
  • 数组元素分布不均匀时,插值查找不一定二分查找

3.代码实现

和插入排序的区别:

  • mid的计算和二分查找不一样 int mid = left + (target - arr[left]) * (right - left) / (arr[right] - arr[left]);
  • mid判断是否越界(递归条件):if (left > right || target < arr[0] || target > arr[arr.length - 1]) return result;
private static List<Integer> result = new ArrayList<>();
public static List<Integer> search(int[] arr, int left, int right, int target) {
        //递归结束条件:left>right 但没有找到目标值  mid判断是否越界
        if (left > right || target < arr[0] || target > arr[arr.length - 1]) return result;
        int mid = left + (target - arr[left]) * (right - left) / (arr[right] - arr[left]);
        int midVal = arr[mid];
        if (target > midVal) return search(arr, mid + 1, right, target);//右侧递归
        else if (target < midVal) return search(arr, left, mid - 1, target);//左侧递归
        else {//相等
            result.add(mid);
            int temp = mid - 1;
            while (true) {//左边扫描 添加右边与之相同的值
                if (temp < 0 || arr[temp] != target) break;//下标越界或不为目标值
                result.add(temp);//添加下标
                temp -= 1;//左移
            }
            temp = mid + 1;//右边扫描 添加右边与之相同的值
            while (true) {
                if (temp > arr.length - 1 || arr[temp] != target) break;//下标越界或不为目标值
                result.add(temp);//添加下标
                temp += 1;//右移
            }
            return result;//返回下标集合
        } //else
    }

4.运行效果

13 16 10 17 4 12 14 7 17 16 11 18 5 4 10 3 13 10 4 0 
最大数18
因此最大位数2
按照第1位,本轮排序结果:10 10 10 0 11 12 13 3 13 4 14 4 4 5 16 16 17 7 17 18 
按照第2位,本轮排序结果:0 3 4 4 4 5 7 10 10 10 11 12 13 13 14 16 16 17 17 18 
0 3 4 4 4 5 7 10 10 10 11 12 13 13 14 16 16 17 17 18 
插值查找11
下标[10]
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值