三种查找算法

一、二分查找

  每次数据都从中间取,取值比目标值小的话就就往右边查找,大的话就从左边查找 ( 从左往右数值依次增大)

1e9c1e68e18244a888899aadcb1aeaf1.jpeg

   代码如下:

//二分查找
int Search_half(int*array,int size,int val)
{
	int left=0;
    int right=size-1;
	int mid;
	while(left<=right)
    {	//确定mid位置
		mid=(left+right)/2;
        //该位置值比目标值小,向右半部分查找
        if(array[mid]<val)
        {
			left=mid+1;
        }
        //该位置值比目标值大,向左半部分查找
        else if(array[mid]>val)
        {
			right=mid-1;
        }
        //找到目标值所在位置
        else
            return mid;
    }
    //未找到目标值
    return -1;
}

二 . 插值查找法

   与二分查找法相同,由于算法家们的改进,只需将原来的mid改为

mid= left + ( ( val-array[left])/(array[right]-array[left] ) )* ( right-left )

//插值查找
int Search_insert(int*array,int size,int val)
{
	int left=0;
    int right=size-1;
	int mid;
	while(left<=right)
    {	//确定mid位置
		mid=left+((val-array[left])/(array[right]-array[left]))*(left+right);
        //该位置值比目标值小,向右半部分查找
        if(array[mid]<val)
        {
			left=mid+1;
        }
        //该位置值比目标值大,向左半部分查找
        else if(array[mid]>val)
        {
			right=mid-1;
        }
        //找到目标值所在位置
        else
            return mid;
    }
    //未找到目标值
    return -1;
}

三 . 斐波那契查找

原理与上面两种类似,不过分割范围有所不同,斐波那契查找利用黄金分割法,左占0.618,利用该方法查找时需要构建一个斐波那契数组 Fibonacci={ 1 , 1 , 2 , 3 , 5 , 8 , 13 , 21 , 34 , . . . . . .} , mid= left + F[k-1] -1 ;

① 从斐波那契数列中找到第一个比数组尺寸大的数,记录下标为k

② 越界部分用数组最后一个元素填充,mid=left+F[k-1]-1

③ 如果当前位置的值比目标值小,则从右边查找,并更改查找范围,即k=k-2;

    如果当前位置的值比目标值大,则从左边查找,更改查找范围,即k = k - 1 ;

 重复执行③,直到找到为止

 

 

 

 代码如下:

//斐波那契查找
int Search_Fibonacci(int*array,int size,int val)
{
	//生成相应斐波那契数组
    int*F=malloc(sizeof(int)*100);
    F[0]=1;
    F[1]=1;
    for(int i=2;i<100;i++)
        F[i]=F[i-1]+F[i-2];
	//找到第一个比数组尺寸大的斐波那契数所在位置
    int k=0;
    while(F[k]<=size)
        k++;
	//将越界部分填充
    for(int i=size;i<F[k];i++)
    {
		array[i]=array[size-1];
    }
    int left=0;
    int right=F[k]-1;
    int mid;
    
    while(left<=right)
    {
		mid=left+F[k-1]-1;
        
        if(array[mid]<val)
        {//缩小查找范围,向右侧查找
			left=mid+1;
            k=k-2;
        }
        else if(array[mid]>val)
        {//缩小查找范围,向左侧查找
			right=mid-1;
            k=k-1;
        }
        else
            return mid;//找到
    }
    //未找到
    return -1;
}

 

 

 

相关推荐

  1. 决策树算法

    2024-06-16 12:36:02       49 阅读
  2. 文本相似度的算法

    2024-06-16 12:36:02       28 阅读
  3. 树的遍历方式-算法

    2024-06-16 12:36:02       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-16 12:36:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-16 12:36:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-16 12:36:02       82 阅读
  4. Python语言-面向对象

    2024-06-16 12:36:02       91 阅读

热门阅读

  1. vue学习(一)

    2024-06-16 12:36:02       28 阅读
  2. vue相关的前端知识回顾

    2024-06-16 12:36:02       31 阅读
  3. vue中的组件通信

    2024-06-16 12:36:02       48 阅读
  4. 使用C++调用VTK库实现三维显示示例

    2024-06-16 12:36:02       41 阅读
  5. 微信小程序(2)

    2024-06-16 12:36:02       41 阅读
  6. Linux系统内核作用

    2024-06-16 12:36:02       31 阅读