这是极其简单的一个算法,正是因为其简单,我经常被其搞死。不管是在比赛时还是在面试时,我都在这上面栽过跟头。因为其简单,所以总也不愿花过多时间来写它,总想一气呵成,但总也呵不成,于是脑袋越来越混乱,情绪越来越激动,于是悲剧随之而来。
二分查找要求被查找数组是排好序的数组,其时间复杂度为O(log(n)),也就是说1亿的数据量大概运行26次就能求出结果。
#include <stdio.h>
#include <stdlib.h>
int b_search(void* arr, int n, int(*cmp)(void*, void*), void* key, int size)
{
int left = 0, right = n - 1, mid = 0;
while (left <= right)
{
mid = (left + right) / 2;
if (cmp(key, (char*)arr + mid * size) == 0)
return mid;
else if (cmp(key, (char*)arr + mid * size) < 0)
right = mid - 1;
else
left = mid + 1;
}
return -1;
}