• [数据结构和算法]二分查找近似值


    bsearch() 查找

    C语言中 bsearch 包含在 头文件中。
    此函数可以根据你给的条件实现二分查找,如果找到元素则返回指向该元素的指针,否则返回NULL;针对有多个元素匹配成功的情况,bsearch()未定义返回哪一个。
    使用 bsearch() 函数也需要自己定义比较子函数

    void *bsearch(const void *key, const void *base, size_t num, size_t size, int(*cmp)(const void*, const void *));
    
    • 1

    参数说明:

    • key: 指向要查找的元素指针,类型转换为 void*
    • base: 指向进行查找的数组,类型转换为 void*
    • num: 数组元素个数
    • size: 数组中每个元素的大小,一般用sizeof()表示
    • cmp: 比较两个元素的函数,定义比较规则
      返回值:
    • 如果查找成功,该函数返回一个指向数组元素中匹配元素的指针,否则返回空指针
    #include 
    #include 
    
    #define NUM 8
    
    int compare(const void *p, const void *q){
    	return (*(int *)p - *(int *)q);
    }
    
    int main(int argc, char *argv[]){
    	int array[NUM] = {9, 2, 7, 11, 3, 87, 34, 6};
    	int key = 3;
    	int *p;
    	
    	p = (int *)bsearch(&key, array, NUM, sizeof(int), compare);
    	
    	(p == NULL) ? puts("not found") : puts("found");
    	
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    二分查找近似值

    #include 
    #include 
    #include 
    #include 
    
    typedef unsigned char uint8_t;
    typedef unsigned short int uint16_t;
    typedef unsigned int uint32_t;
    
    #define ARRAY_SIZE(arr, type)   sizeof(arr)/sizeof(type)
    
    const float tab[] = {
        1.0, 3.0, 5.0, 7.0, 9.0, 11.0, 13.0, 15.0, 17.0, 19.0,
        21.0, 23.0, 25.0, 27.0, 29.0, 31.0, 33.0, 35.0, 37.0, 39.0,
        41.0, 43.0, 45.0, 47.0, 49.0, 51.0, 53.0, 55.0, 57.0, 59.0,
        61.0, 63.0, 65.0, 67.0, 69.0, 71.0, 73.0, 75.0, 77.0, 79.0,
        81.0, 83.0, 85.0, 87.0, 89.0, 91.0, 93.0, 95.0, 97.0, 99.0,
    };
    
    float binSearch(float dat){
        uint16_t max = ARRAY_SIZE(tab, float) - 1;
        uint16_t min = 0;
        div_t mid = {0};
    
        if(dat < tab[min]){
            return tab[min];
        }else if(dat > tab[max]){
            return tab[max];
        }
    
        while(tab[max] >= tab[min]){
            mid = div(max + min, 2);
            if((dat > tab[mid.quot]) && (dat < tab[mid.quot+1])){
                return (abs(tab[mid.quot] - dat) < abs(tab[mid.quot+1] - dat))?tab[mid.quot]:tab[mid.quot+1];
            }else if(dat > tab[mid.quot]){
                min = mid.quot;
            }else if(dat < tab[mid.quot]){
                max = mid.quot + mid.rem;
            }else{
                return tab[mid.quot];
            }
            // printf("min[%d-%.1f]    mid[%d-%.1f]    max[%d-%.1f]\n",min,tab[min], mid.quot,tab[mid.quot], max,tab[max]);
        }
    
        return 0;
    }
    
    int main(void){
        float tmp = 2.0;
    
        while(1){
            scanf("%f", &tmp);
            printf("> > > > [%.1f] 找到近似值:%.2f < < < <\n", tmp, binSearch(tmp));
        }
    
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58

    在这里插入图片描述

  • 相关阅读:
    2022-06-22 用python合并多个文本文件
    PHP笔记-使用composer搭建Laravel项目及phpStorm开发环境搭建
    反序列化漏洞详解
    【C++】不能两次杀死同一条鱼 - 浅述shared_ptr智能指针的使用方法
    c盘清除文件
    Flask数据库_filter过滤器的使用
    【编程技巧】用size_t定义数量有什么好处
    Yaml语法学习
    MongoDB【部署 04】Windows系统实现MongoDB多磁盘存储
    java-php-python-springboot携手助学助学交流平台计算机毕业设计
  • 原文地址:https://blog.csdn.net/slimmm/article/details/126766369