二分查找 Binaryserach

   二分查找:

   二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

     //考虑边界条件

 1 //[]闭区间
 2 int Binaryserach(int *array, int size, int key)
 3 {
 4     assert(array != NULL);
 5     int left = 0;
 6     int right = size - 1;
 7     while (left <= right)
 8     {
 9         int mid =( (right - left) >>1) + left;
10         if (array[mid] > key)
11         {
12             right = mid - 1;
13         }
14         else if (array[mid] < key)
15         {
16             left = mid + 1;
17         }
18         else
19         {
20             return mid;
21         }
22     }
23     return -1;
24 }

 

 

 1 //[)半开半闭区间
 2 int Binaryserach(int *array, int size, int key)
 3 {
 4         assert(array != NULL);
 5         int left = 0;
 6         int right = size;
 7         while (left < right)
 8         {
 9             int mid =( (right - left) >>1) + left;
10             if (array[mid] > key)
11             {
12                 right = mid ;
13             }
14             else if (array[mid] < key)
15             {
16                 left = mid + 1;
17             }
18             else
19             {
20                 return mid;
21             }
22         }
23         return -1;
24 }

   /*递归实现(递归算法解题通常显得比较简洁,但递归算法解题的运行效率较低;
在递归调用的过程中系统为一层返回点、局部变量开辟了栈来存储,空间复杂度增大。一般情况下不建议用递归算法设计程序)*/

 1 int Binaryserach(int *array, int left,int right,int key)
 2 {
 3     assert(array != NULL);
 4     if (left <= right)
 5     {
 6         int mid = ((right - left) >> 1) + left;
 7         if (array[mid] == key)
 8         {
 9             return mid;
10         }
11         if (array[mid] > key)
12         {
13             return Binaryserach(array, left, mid - 1, key);
14         }
15         else
16         {
17             return Binaryserach(array, mid + 1, right, key);
18         }
19     }
20     else 
21         return -1;
22 }

 

posted @ 2016-05-16 21:33  A_carat_tear  阅读(298)  评论(0编辑  收藏  举报