九种查找算法-插值查找

插值查找

 

一、什么是插值查找

(1)插值查找算法类似于二分查找,不同的是插值查找每次从自适应 mid 处开始查找。

(2)二分查找中mid值是left和right所指序列下标的和的1/2即 mid = (left+right)/ 2。

(3)而插值查找的mid 值是通过公式计算得来由,由公式可以明显看出mid的值并非像二分那样为左右索引的中间位置。

(4)插值查找公式;3、int mid = low + (high - low) * (key - arr[low]) / (arr[high] - arr[low]) ;low表示左边索引left,high表示右边索引right. key 就是需要查找的值。

二、插值查找的特点

(1)查找的序列必须有序

(2)对于数据量大的以及关键字分布均匀的有序序列来说,插值查找的速度较快。

(3)对于分布不均匀的有序序列来说,该算法不一定比二分查找要好。

 

插值查找基于二分查找算法,将查找点的选择改进为自适应选择,可以提高查找效率。当然,差值查找也属于有序查找

算法思路

  1. 确定查找范围low=0,high=N-1,计算中项mid=low+(key-a[low])/(a[high]-a[low])*(high-low)。

  2. 若mid==x或low>=high,则结束查找;否则,向下继续。

  3. 若amid<x,说明待查找的元素值只可能在比中项元素大的范围内,则把mid+1的值赋给low,并重新计算mid,转去执行步骤2;若mid>x,说明待查找的元素值只可能在比中项元素小的范围内,则把mid-1的值赋给higt,并重新计算mid,转去执行步骤2。

说明

  • 插值查找是基于折半查找进行了优化的查找方法。

  • 当表长较大,而关键字分布又比较均匀的查找表来说,插值查找算法的平均性能要比折半查找要好得多。

代码

#include<stdio.h>

int array[10] = { 1, 4, 9, 16, 27, 31, 33, 35, 45, 64 };

int InsertionSearch(int data)
{
    int low = 0;
    int high = 10 - 1;
    int mid = -1;
    int comparisons = 1;
    int index = -1;
    
    while(low <= high)
    {
       printf("比较 %d 次\n" , comparisons );
       printf("low : %d, list[%d] = %d\n", low, low, array[low]);
       printf("high : %d, list[%d] = %d\n", high, high, array[high]);

       comparisons++;
       mid = low + (((double)(high - low) / (array[high] - array[low])) * (data - array[low]));
       printf("mid = %d\n",mid);
       
       // 没有找到
       if(array[mid] == data)
       {
	   index = mid;
           break;
        }
	else
	{
	   if(array[mid] < data)
           {
               low = mid + 1;
           }
           else
	   {
	       high = mid - 1;
	    }
	 }
     }

     printf("比较次数: %d\n", --comparisons);
     return index;
}

int main()
{
    int location = InsertionSearch(27);  //测试代,查27,可以找到
    if(location != -1)
    {
	printf("查找元素顺序为: %d\n" ,(location+1));
     }
     else
     {
         printf("没有查找到");
     }
     return 0;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大雄是个程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值