二分查找法

    二分查找法又称为折半查找法,在很多数学书上可以看到它的存在。其查找速度快,平均性能好,缺点是要求待查找序列必须为有序。因此二分查找法主要用于序列有序,变动少的查找操作。根据编程珠玑上面的说法,很多程序猿都无法正确的写出二分查找法,因为其需要注意的地方还是蛮多的,很多公司也乐于拿它当作笔试题目,屡见不鲜。

    二分查找法的主要过程为:因为序列有序,前后坐标为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);
}

    测试结果:

二分查找法_第1张图片


     ________________The End。



你可能感兴趣的:(算法,C语言,search,binary,二分)