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

bsearch() 查找

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

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

参数说明:

  • key: 指向要查找的元素指针,类型转换为 void*
  • base: 指向进行查找的数组,类型转换为 void*
  • num: 数组元素个数
  • size: 数组中每个元素的大小,一般用sizeof()表示
  • cmp: 比较两个元素的函数,定义比较规则
    返回值:
  • 如果查找成功,该函数返回一个指向数组元素中匹配元素的指针,否则返回空指针
#include <stdio.h>
#include <stdlib.h>

#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;
}

二分查找近似值

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <math.h>

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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值