折半查找要求记录中的关键码必须是有序的,并且存储结构必须是顺序存储(因为链式存储不能随机存取,无法直接取到分割点对应的值)
普通实现:
unsigned int BinarySearch(int *pArray, int arraySize, int value)
{
if (pArray != NULL && arraySize > 0)
{
unsigned int uLow = 0;
unsigned int uHigh = arraySize - 1;
while (uLow <= uHigh)
{
unsigned int uMid = (uHigh + uLow) / 2;
if (value == pArray[uMid])
return uMid;
else if (value < pArray[uMid])
uHigh = uMid - 1;
else
uLow = uMid + 1;
}
}
return -1;
}
递归实现:
unsigned int BinarySearchCallSelf(int *pArray, int low, int high,int value)
{
if (pArray != NULL)
{
if (low <= high)
{
unsigned uMid = (low + high) / 2;
if (pArray[uMid] == value)
return uMid;
else if (value < pArray[uMid])
return BinarySearchCallSelf(pArray, low, uMid - 1, value);
else
return BinarySearchCallSelf(pArray, uMid + 1, high, value);
}
}
return -1;
}
当数据均匀分布时可以采用插值排序,所以根据数据情况选择,原理是先把 mid = (high+low)/2 转化成 mid = low+(high-low)/2。用 (value-pArray[low])/(pArray[high]-pArray[low]) 替代 1/2,最终的mid变成mid = low+(high-low)*(value-pArray[low])/(pArray[high]-pArray[low])。
还有一种斐波那契查找,我觉得意义不大,以后有时间在研究。