例25:二分查找
二分查找大一的时候是试图写过一次的,但当时因为还加了一种其他算法,所以也没有写出来,之后对它有了一种很难的感觉,但现在一看,其实也非常简单。它其实就是好像电气工程师找电线断点一样,对半找,理论上最快。哎,我实在不知道这算法的思想该怎么去说,所以直接上步骤,后面接代码。
1.直接从中间的元素开始找,此元素与要找的值做比较,有三种情况,相等,大于和小于,相等则记录此元素位置并返回true结束函数,大于则缩小范围,让右边界等于此元素的位置减一,小于则让左边的边界等于此元素位置加一。
2.循环此过程直到左边界大于右边界跳出,此时其中始终没有元素与要找的值相等,所以代表未找到,返回false结束函数。
代码如下:
1 #include<stdio.h> 2 #include<stdlib.h> 3 4 bool BinarySearch(int *pArray,int nCount,int *pCount,int numAnswer) 5 { 6 int low = 0,high = nCount-1; 7 while(low <= high) 8 { 9 int middle = low + (high-low)/2; 10 if(pArray[middle] == numAnswer) 11 { 12 *pCount = middle+1; 13 return true; 14 } 15 else if(pArray[middle] > numAnswer) 16 { 17 high = middle - 1; 18 } 19 else 20 { 21 low = middle + 1; 22 } 23 } 24 return false; 25 } 26 int main() 27 { 28 int pArray[20],nCount,numAnswer,answerPos; 29 while(~scanf("%d",&nCount) && nCount) 30 { 31 for(int i = 0;i<nCount;i++) 32 { 33 scanf("%d",&pArray[i]); 34 } 35 scanf("%d",&numAnswer); 36 if(BinarySearch(pArray,nCount,&answerPos,numAnswer)) 37 printf("answerPos:%d\n",answerPos); 38 else 39 printf("The Number is Not Here!\n"); 40 } 41 42 return 0; 43 }