码迷,mamicode.com
首页 > 其他好文 > 详细

二分查找

时间:2016-03-21 01:56:47      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:数组边界 二分查找


【二分查找】

前提:在一个已序的空间中查找

注意:查找边界条件


情况一:左闭右开 【 ),右边界始终无法取到

假如前开后闭空间 【left,right),比如int array[10]={0,1,2,3,4,5,6,7,8,9};【0,10)

int BinarySearch (int a[],int size,int data)

{

   int left=0;

   int right=size;

   int mid=0; 

   while(left<right)//注意此处不能去等号

     {

        mid=left + (right-left)/2;

        if(data<a[mid])

           {

             right=mid;

           }

        else if(data>a[mid])

           {

             left=mid+1;

           }

        else

           {

             return mid;

           }

     }

     return -1;

}

假如查找3

1 2 3 4 5 6 7 8 9

第一次 【1,9) mid=4 a[4]>3 缩小右边界 [0,4)

        即直接right=mid;

第二次 【0,4) mid=2 a[2]==3 退出

假如找9

第一次 【0,9) mid=4 a[4]<9 改变左边界[5,9)

第二次 【5,9)mid=9 a[7]<9 改变左边界[8,9)

第三次 【8,9)mid=8 a[8]==9 退出


情况二:左闭右闭 右边界可以取到

假如前开后闭空间 【left,right】,比如int array[10]={0,1,2,3,4,5,6,7,8,9};【0,9】

int BinarySearch (int a[],int size,int data)

{

   int left=0;

   int right=size;

   int mid=0; 

   while(left<right)//注意必须加=号,比如查找最后一个元素

     {

        mid=left + (right-left)/2;

        if(data<a[mid])

           {

             right=mid-1;

           }

        else if(data>a[mid])

           {

             left=mid+1;

           }

        else

           {

             return mid;

           }

     }

     return -1;

}

假如查找4

1 2 3 4 5 6 7 8 9

第一次 [0,8] mid =4 a[4]>4  缩小右边界[0,3]

第二次 [0,3] mid =1 a[1]<4  改变左边界[2,3]

第三次 [2,3] mid=2  a[2]<4  改变左边界[3,3]

第四次 [3,3] mid=3  

二分查找

标签:数组边界 二分查找

原文地址:http://11285984.blog.51cto.com/11275984/1753251

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!