算法学习记录-查找——折半查找(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 }


测试结果:

 

 

转载于:https://www.cnblogs.com/jsgnadsj/p/3466981.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值