折半查找法:
在有序表中,把待查找数据值与查找范围的中间元素值进行比较,会有三种情况出现:
1) 待查找数据值与中间元素值正好相等,则返回中间元素值的索引。
2) 待查找数据值比中间元素值小,则以整个查找范围的前半部分作为新的查找范围,执行1),直到找到相等的值。
3) 待查找数据值比中间元素值大,则以整个查找范围的后半部分作为新的查找范围,执行1),直到找到相等的值
4) 如果最后找不到相等的值,则返回错误提示信息。
按照二叉树来理解:中间值为二叉树的根,前半部分为左子树,后半部分为右子树。折半查找法的查找次数正好为该值所在的层数。等概率情况下,约为
log2(n+1)-1
-
int main(int argc, const char * argv[])
{
int searchArray[100];//要查找的数组
for (int i = 0; i < 100; i++) {
searchArray[i] = i + 1;
}
int index = 0;//要查找的数所在的索引
int searchNum = 45;//需要查找的数
//循环查找
int searchIndex1(int array[],int const searchNum,int maxIndex,int minIndex);
//递归查找
int searchIndex2(int array[],int const searchNum,int maxIndex,int minIndex);
index = searchIndex1(searchArray, searchNum, 99, 0);
index = searchIndex2(searchArray, searchNum, 99, 0);
printf("index = %d ",index);
/*折半查找的思想是:
将要查找数searchNum和数组中间的进行比较,如果searchNum < searchArray[midIndex],让最大索引maxIndex = midIndex - 1,如果searchNum > searchArray[midIndex]让最小索引minIndex = midIndex + 1,最终找到要查找的数。
循环查找:
用while (minIndex <= maxIndex)作为循环判断,直到找到需要查找的数为止
递归查找:
递归是在searchNum != searchArray[midIndex]的时候调用自身,一直到找到要查找的数为止*/
return 0;
}
int searchIndex1(int searchArray[],int const searchNum,int maxIndex,int minIndex)
{
if (minIndex > maxIndex) {
return -1;
}
while (minIndex <= maxIndex) {
int midIndex= (maxIndex + minIndex) / 2;
if (searchNum == searchArray[midIndex]) {
printf("midIndex = %d ",midIndex);
return midIndex;
}
else if (searchNum < searchArray[midIndex])
{
maxIndex = midIndex - 1;
}
else if (searchNum > searchArray[midIndex])
{
minIndex = midIndex + 1;
}
}
return -1;
}
int searchIndex2(int searchArray[],int const searchNum,int maxIndex,int minIndex)
{
if (minIndex > maxIndex) {
return -1;
}
int midIndex = (maxIndex + minIndex) / 2;
if (searchNum == searchArray[midIndex]) {
printf("midIndex = %d ",midIndex);
return midIndex;
}
else if (searchNum < searchArray[midIndex])
{
return searchIndex2(searchArray, searchNum, midIndex - 1, minIndex);
}
else if (searchNum > searchArray[midIndex])
{
return searchIndex2(searchArray, searchNum, maxIndex, midIndex + 1);
}
return -1;
}