#include <stdio.h>
/// 1 4 7
/// ret -1 前查找
/// ret 0 找到
/// ret 1 后查找
int com_imple(const void* src, const void* tar)
{
int data1 = *((int*)src);
int data2 = *((int*)tar);
if (data1 == data2)
return 0;
else if (data1 < data2)
return 1;
else
return -1;
}
typedef int (*compare)(const void*, const void*);
int find(const void* arry, const int count, const int size,
compare com_func, const void *target)
{
void* src;
int head, tail, mid, ret;
head = 0;
tail = (count - 1);
while (head < tail) {
mid = ((head + tail) / 2);
src = (char *)arry + (mid * size);
ret = com_func(src, target);
if (ret == 0)
return mid;
else if (ret < 0)
tail = (mid - 1);
else
head = (mid + 1);
}
if (head == tail) {
src = (char*)arry + (head * size);
ret = com_func(src, target);
if (ret == 0)
return head;
}
return -1;
}
int main()
{
int arry[4] = {1, 2, 8, 10};
int target = 8;
int ret = find(arry, 4, 4, com_imple, &target);
printf("find target @%d \n", ret);
target = 10;
ret = find(arry, 4, 4, com_imple, &target);
printf("find target @%d \n", ret);
target = 12;
ret = find(arry, 4, 4, com_imple, &target);
printf("find target @%d \n", ret);
}