二分查找法以及拉格朗日插值查找法

  • 不管是二分查找法还是拉格朗日法,必须先排序,否则无法使用。
  • 插值查找发速度比二分查找法要快
  • 插值查找法,数据均匀是1次找到,不均匀是多次,即使这样这样它也是快于二分的。
  • 那个1.0挺重要的一个技巧,将那个比例变成实数。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include <stdlib.h>
#define  N 1024

void search(int a[N],int num)
{
    int  tou = 0;
    int wei = N - 1;

    int zhong;
    int flag = -1;//代表找不到
    int ci = 0;
    while (tou <= wei)//循环
    {

        zhong =( tou + wei) / 2;//取中间值

        printf("\n%d,%d,%d,%d", tou, wei, zhong, ++ci);

        if (num==a[zhong])
        {
            printf("找到,a[%d]=%d", zhong, num);
            flag = 1;
            break;
        }
        else if (num> a[zhong])
        {
            tou = zhong + 1;

        }
        else
        {

            wei = zhong - 1;
        }
    }

    if (flag ==-1)
    {
        printf("没有找到");
    }

}

void search2(int a[N], int num)
{
    int  tou = 0;
    int wei = N - 1;

    int zhong;
    int flag = -1;//代表找不到
    int ci = 0;
    while (tou <= wei)//循环
    {

        zhong = tou + (wei - tou) *1.0* (num - a[tou]) / (a[wei] - a[tou]);  //乘以0.1是为了防止误差。

        printf("\n%d,%d,%d,%d", tou, wei, zhong, ++ci);

        if (num == a[zhong])
        {
            printf("找到,a[%d]=%d", zhong, num);
            flag = 1;
            break;
        }
        else if (num > a[zhong])
        {
            tou = zhong + 1;

        }
        else
        {

            wei = zhong - 1;
        }

    }

    if (flag == -1)
    {
        printf("没有找到");
    }

}

void main()
{
    int a[N];
    for (int i = 0; i < N; i++)
    {
        a[i] = i;
        printf("%d  ", i);
    }
    int num;
    scanf("%d", &num);

    search2(a, num);//调用函数查找

    system("pause");

}
时间: 2024-11-07 20:52:49

二分查找法以及拉格朗日插值查找法的相关文章

快速排序 and 拉格朗日插值查找

private static void QuictSort(int[] zu, int left, int right) { if (left < right) { int i = 0; int j = right - 1; int mid = zu[(left + right) / 2]; while (true) { while (i<right && zu[i]<mid) { i++; } while (j > left && zu[j] &g

拉格朗日插值查找法

#include<iostream> using namespace std; int search(const int*, int, int); int main() { int arr[6] = {1,2,3,4,10,20}; int find = search(arr, 6, 10); if(find == -1) cout << "没有找到!" << endl; else cout << arr[find] << e

看数据结构写代码(53) 静态查找表(线性查找,二分查找,斐波那契查找,插值查找)

查找定义:根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素(或记录). 查找表分类:静态查找表和动态查找表. 静态查找表:只查找,而不进行插入,删除. 动态查找表:在查找过程中同时插入查找表中不存在的数据元素,或者从查找表中删除已经存在的某个数据元素. 静态表的 查找 大致 四种 算法: 线性查找,二分查找,斐波那契查找和插值查找. 其中 在线性查找之前,对表 无要求.对于 其余三种 需要 在查找之前 排序.插值查找 除了 需要 排序,还需要 均匀分布. 下面 给出代码: 线性查

插值查找

在介绍插值查找之前,首先考虑一个问题,为什么二分查找算法中一定是折半,而不是折四分之一,或者折更多呢?打个比方,在英文字典里面查"apple",你下意识翻开字典是翻前面的书页还是后面的书页呢?如果再查"zoo",又该怎么查呢?很显然,这两个单词绝对不会从中间开始查起,而是有一定目的地从前或从后开始查:同样地,比如要在取值范围1~10000之间100个元素从小到大均匀分布的数组中查找5,我们自然会考虑从数组下标较小的开始查找:经过以上分析,二分查找这种查找方式,不是自

常见的查找算法(三):插值查找

插值搜索法(Interpolation search)是利用插值公式来计算猜测搜索键值的位置.搜索方式与二分搜索相同 插值公式: 插值 = (设算数 -­ 最小数) / (最大数 -­ 最小数): [2] 搜索键值 = left + parseInt( ( key - data[ left ] ) / ( data[ right ] - data[ left ] ) ) * ( right - left ) ) 插值搜索之算法与二分搜索算法几乎完全相同,差别在: 二分搜索法:猜测键值在中间位置(

基础算法-查找:插值查找

算法描述 先来看一个实际问题:我们在一本英汉字典中寻找单词“worst”,我们决不会仿照对半查找(或Fibonacci查找)那样,先查找字典中间的元素,然后查找字典四分之三处的元素等等. 事实上,我们是在所期望的地址(在字典的很靠后的地方)附近开始查找的,我们称这样的查找为插值查找. 可见,插值查找不同于前面讨论的几种查找算法,前面介绍的查找算法是基于严格比较的,即假定我们对线性表中元素的分布一无所知(或称没有启发式信息). 然而实际中,很多查找问题所涉及的表满足某些统计的特点. 插值查找在实际

基于二分查找法的数值区间查找

1.问题定义: 在有序数组中,查找在输入数组满足大于某值a,小于某值b的所有元素.其中a和b可以不在数组中. 2.举例描述: 输入数组eg:{2,7,8,11,16,26,31,33,37,40,45,49}.查找满足大于10小于30的所有数字,则输出的结果为{11,16,31}子集.若查找大于50或小于2则输出空集. 3.线性扫描方式: 复杂度O(n) 从左到右扫描满足条件的区间 4.二分查找方式: 复杂度O(logN)二分查找满足条件的区间,两次二分查找,确定子数组范围. auto bina

查找系列之简述顺序查找和二分查找

顺序查找和二分查找 一.顺序查找思想 1. 从表的一端开始扫描,顺序扫描线性表,依次扫描到的结点关键字与给定的值K相比较.如果当前扫描到的结点的关键字与给定的值K相等,则查找成功;若扫描结束后,仍未找到关键字与给定的值K相等,则查找失败; 2.顺序查找既适用于顺序存储结构,也适用于线性表的链式存储结构; 3.ASL= (n+1)/2为其平均查找长度 4.优点:算法简单,对存储结构形式没有要求 缺点:浪费空间,当长度非常大是效率低 5.算法描述: /** *顺序查找 *@param int a[]

9.18 内存区域 全局变量 线程 插值查找 位域 栈的实现

栈区可以修改默认大小配置: 栈区默认的大小是1M,在vs2013中可以修改. 堆区和栈区的地址区别: 栈是连续的,向上增长,地址越来越小.类似数组. 堆是链接的,向下增长,地址越来越大.类似链表. 栈区   高地址到低地址 堆区   低地址到高地址 #include <stdio.h> #include <stdlib.h> int main() { int a = 1, b = 2; printf("%p,%p\n", &a, &b); //a