zoukankan      html  css  js  c++  java
  • 算法学习记录-查找——折半查找(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("
    ");
    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:
    ");
    63     prt_ary(src_ary,10);
    64 
    65     bubble_sort(src_ary,10);
    66 
    67     printf("after sort:
    ");
    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!
    ");
    74     }
    75     else
    76     {
    77         printf("index = %d
    ",idx);
    78     }
    79 
    80     getchar();
    81     return 0;
    82 }


    测试结果:

  • 相关阅读:
    IISManager 的启动
    基于hadoop集群的hive 安装(mysql,derby)
    Struts中央控制器
    在Spring中配置Hibernate事务
    java 实现多线程下载
    hello,博客园
    easyui datagrid中添加右键菜单事件
    C#项目打包
    easyui datagrid中单击添加菜单事件
    SQL多条件查询拼接in中条件方法
  • 原文地址:https://www.cnblogs.com/jsgnadsj/p/3466981.html
Copyright © 2011-2022 走看看