二分查找法又称为折半查找法,在很多数学书上可以看到它的存在。其查找速度快,平均性能好,缺点是要求待查找序列必须为有序。因此二分查找法主要用于序列有序,变动少的查找操作。根据编程珠玑上面的说法,很多程序猿都无法正确的写出二分查找法,因为其需要注意的地方还是蛮多的,很多公司也乐于拿它当作笔试题目,屡见不鲜。
二分查找法的主要过程为:因为序列有序,前后坐标为lower和upper。所以只需要比较目的值(dest value)与中间位置元素值(middle value)的大小关系,如果dest value比middle value相等,即找到了dest value的索引值。若dest value比middle value要大则dest value值可能在middle 与upper之间。依次递归上述操作,直到查找到对应值,或者查找条件失败,需要查找的值不存在。
假设当前被查找的序列为test[]={1, 3, 5};,dest value=2。
第一次:lower = 0,upper = 2(lower和upper对应数组下标位置),此时lower 小于uper,计算得midlle = (lower + upper)/2,middle等于1,middle位置的元素值(3)大于dest value(2),开始在lower和middle-1(0)位置查找。
第二次:此时lower(0)等于upper(0),计算得middle也等于0,middle处序列值为1比dest value(2)要小,所以开始查找lower(0)到middle-1(-1)位置处的序列。
第三次:传入的参数upper(-1)比lower(0)还要小,故查找结束,返回-1。
假设当前被查找的序列为test[]={1, 3, 5};,dest value=1。
第一次:lower = 0,upper = 2(lower和upper对应数组下标位置),此时lower 小于uper,计算得midlle = (lower + upper)/2,middle等于1,middle(3)位置的元素值大于dest value(1),开始在lower和middle-1(0)位置查找。
第二次:此时lower(0)等于upper(0),计算得middle也等于0,middle处序列值为1与dest value(1)相等,所以开始查找到了dest value的索引值为0,返回索引值。
排序操作代码:
static int _bin_search(int *array, int nUpper, int nLower, int nDstVal) { int nMid = (nUpper + nLower) / 2; if(nUpper < nLower) { return (-1); } if (array[nMid] == nDstVal) { return (nMid); } else if(array[nMid] < nDstVal) { return (_bin_search(array, nUpper, nMid + 1, nDstVal)); } else { return (_bin_search(array, nMid - 1, nLower, nDstVal)); } return (-1); }
int binary_search(int *array, int nSize, int nDstVal) { if(array == NULL || nSize <= 1) { return (-1); } return ( _bin_search(array, nSize - 1, 0, nDstVal)); }
测试代码:
int main(int argc, char* argv[]) { int anTest[] = {1,3,5,7,9,11}; int anDst[] = {1, 2, 5, 7, 10, 11}; int nIndex = 0; int nTemp = 0; printf("sources array: "); for(nIndex = 0; nIndex < sizeof(anTest)/sizeof(anTest[0]) - 1; nIndex++) { printf("%d ",anTest[nIndex]); } putchar('\n'); for(nIndex = 0; nIndex < sizeof(anDst) / sizeof(anDst[0]); nIndex++) { printf("dest value :%d ", anDst[nIndex]); nTemp = binary_search(anTest, (sizeof(anTest) / sizeof(anTest[0])), anDst[nIndex]); printf("#dest value index:%d \n", nTemp); } system("pause"); return (0); }
________________The End。