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