这个算法是在原有二分查找的基础上改写的,变为适用于多种数据类型的查找。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void *b_search (void *arr, void *val, int len, int size, int(*cmp)(void *, void *)) {//加入了int (*cmp)(void *,void *)传入一个比较方法
int low = 0;
int high = len-1;
int mid;
while(low <= high) {
mid = (low + high) / 2;
void* addr = (char*)arr + mid * size;
if (cmp(addr, val) == 0) {
return addr;
}
else if (cmp(addr, val) > 0) {
high = mid - 1;
}
else {
low = mid + 1;
}
}
return NULL;
}
int cmp_int (void* x, void* y) {//比较整形数据
int *a = (int*)x;
int *b = (int*)y;
return *a - *b;
}
int cmp_string (void* x, void* y) {//比较字符串
char *a = *(char**)x;
char *b = *(char**)y;
return strcmp(a, b);
}
int main (int argc, char **argv) {
/*测试一*/
int arr[] = {1,2,3,4,5};
int num = 5;
int val = 5;
void* ret = b_search(arr, &val, num, sizeof(int), cmp_int);
if (ret == NULL) {
printf("NULL\n");
}
else {
printf("%d\n", *((int*)ret));
}
/*测试二*/
char* books[] = {"水浒传", "三国演义", "西游记", "红楼梦"};
char* book = "三国演义";
int len = 4;
void* retStr = b_search(books, &book, 4, sizeof(char *), cmp_string);
if (retStr == NULL) {
printf("NULL\n");
}
else {
printf("%s\n", *((char**)retStr));
}
return 0;
}