[英]Binary Search C# implementation
这是我为二分搜索所做的一种实现
public int FindIndexRecursive(int numberToFind, int[] array, int indexMin, int indexMax)
{
if (indexMin > indexMax)
{
return -1;
}
int mid = ((indexMax - indexMin) / 2 ) + indexMin;
if (array[mid] < numberToFind)
{
return FindIndexRecursive(numberToFind, array, mid, indexMax);
}
else if (numberToFind < array[mid])
{
return FindIndexRecursive(numberToFind, array, indexMin, mid);
}
else
{
return mid;
}
}
它工作正常。 我问了一个问题https://codereview.stackexchange.com/questions/71815/binary-search-using-recursion-iteration-shifted-array
我的回答是我可以更改中间计算
from: int mid = ((indexMax - indexMin) / 2 ) + indexMin;
to: int mid = ((indexMax - indexMin) / 2 );
public int FindIndexRecursive2(int numberToFind, int[] array, int indexMin, int indexMax)
{
if (indexMin > indexMax)
{
return -1;
}
int mid = ((indexMax - indexMin) / 2);
//since the array is sorted
if (numberToFind < array[mid])
{
return FindIndexRecursive2(numberToFind, array, indexMin, mid-1);
}
else if (numberToFind > array[mid])
{
return FindIndexRecursive2(numberToFind, array, mid+1, indexMax);
}
else
{
return mid;
}
}
但是现在我出现了堆栈溢出,新实现中缺少什么?
您采用中间的方式是(low+high)/2
。 否则,您将获得堆栈溢出异常。
原始int mid = ((indexMax - indexMin) / 2 ) + indexMin;
计算indexMax
和indexMin
之间的距离,将其减半,并使用它相对于indexMin
索引原始数组。
新的int mid = ((indexMax - indexMin) / 2 );
是错误的,应包含+
而不是-
: int mid = ((indexMax + indexMin) / 2 );
这利用了以下事实:两个值的均值正好在两个值的中间。
如果您用一支笔并将此表达式和原始表达式写成带有分数的表达式,您将得出结论,它们是相等的:
indexMax - indexMin indexMax - indexMin 2 · indexMin indexMax + indexMin
------------------- + indexMin = ------------------- + ------------ = -------------------
2 2 2 2
可能已建议您减少计算中间值的操作数。
(indexMax - indexMin)/2 + indexMin
等于 (indexMax + indexMin)/2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.