算法学习记录-查找——折半查找(Binary Search)
以前有个游戏,一方写一个数字,另一方猜这个数字。比如0-100内一个数字,看谁猜中用的次数少。
这个里面用折半思想猜会大大减少次数。
步骤:(加入数字为9)
1.因为数字的范围是0-100,所以第一次猜50(100的一半)
2.缩小范围到0-50,根据对方回应数大了,再猜25(50的一半)
3.缩小范围到0-25,对方回应数大了,再猜13
4.缩小范围到0-13,对方回应数大了,再猜7
5.缩小范围到7-13,对方回应数小了,再猜10
6.缩小范围到7-10,对方回应数大了,再猜9,中
真是比较差的情况,最差的情况这样逐次缩小到最后一个数,应该是需要猜7次。
这就是折半查找思想,非常的简单,但是有个前提,所要查找的记录序列是有序数列。
知道了思想,程序就好写了。
看图:查找7的过程
折半查找程序:
1 int BinSerch(myDataType *ary,int len,int val) 2 { 3 int low,mid,high; 4 low = 0; 5 high = len-1; 6 7 8 while(low <= high) 9 { 10 mid = (high+low)/2; 11 if (val == ary[mid]) 12 { 13 return mid; 14 } 15 else if (val > ary[mid]) 16 { 17 low = mid+1; 18 } 19 else if (val < ary[mid]) 20 { 21 high = mid-1; 22 } 23 24 } 25 return -1; 26 }
完整代码:
1 #include "stdafx.h" 2 3 typedef int myDataType; 4 //myDataType src_ary[10] = {9,1,5,8,3,7,6,0,2,4}; 5 //myDataType src_ary[10] = {1,2,3,4,5,6,7,8,9,10}; 6 myDataType src_ary[10] = {10,9,8,7,6,5,4,3,2,1}; 7 void prt_ary(myDataType *ary,int len) 8 { 9 int i=0; 10 while(i < len) 11 { 12 printf(" %d ",ary[i++]); 13 } 14 printf("\n"); 15 } 16 17 void bubble_sort (myDataType *ary,int len) 18 { 19 int i,j; 20 for (i=0;i<len;i++) 21 { 22 for (j=len-2;j>=i;j--) 23 { 24 if (ary[j] > ary[j+1]) 25 { 26 myDataType temp = ary[j]; 27 ary[j] = ary[j+1]; 28 ary[j+1] = temp; 29 } 30 } 31 } 32 } 33 int BinSerch(myDataType *ary,int len,int val) 34 { 35 int low,mid,high; 36 low = 0; 37 high = len-1; 38 39 40 while(low <= high) 41 { 42 mid = (high+low)/2; 43 if (val == ary[mid]) 44 { 45 return mid; 46 } 47 else if (val > ary[mid]) 48 { 49 low = mid+1; 50 } 51 else if (val < ary[mid]) 52 { 53 high = mid-1; 54 } 55 56 } 57 return -1; 58 } 59 60 int _tmain(int argc, _TCHAR* argv[]) 61 { 62 printf("before sort:\n"); 63 prt_ary(src_ary,10); 64 65 bubble_sort(src_ary,10); 66 67 printf("after sort:\n"); 68 prt_ary(src_ary,10); 69 70 int idx = BinSerch(src_ary,10,7); 71 if (-1 == idx) 72 { 73 printf("no value in array!\n"); 74 } 75 else 76 { 77 printf("index = %d\n",idx); 78 } 79 80 getchar(); 81 return 0; 82 }
测试结果: