Chinaunix首页 | 论坛 | 博客
  • 博客访问: 45803
  • 博文数量: 11
  • 博客积分: 383
  • 博客等级: 一等列兵
  • 技术积分: 133
  • 用 户 组: 普通用户
  • 注册时间: 2009-10-17 19:54
文章分类

全部博文(11)

文章存档

2012年(3)

2011年(8)

我的朋友

分类: LINUX

2011-09-03 12:49:33

二分法是常用的查找有序数组中元素位置的算法,其基本的查找时间效率为O(lgn)。本文总结二分法的递归查找算法和非递归查找算法。
二分法的非递归的算法代码如下:
  1. int search(int array[], int len, int target)
  2. {
  3.     int low, high, middle;

  4.     low = 0, high = len - 1;

  5.     while(low <= high)
  6.     {
  7.         middle = (int)((low + high) >> 1);
  8.         if(array[middle] < target)
  9.         {
  10.             low = middle + 1;
  11.         }
  12.         else if(array[middle] > target)
  13.         {
  14.             high = middle - 1;
  15.         }
  16.         else
  17.         {
  18.             return middle;
  19.         }
  20.     }

  21.     return -1;
  22. }
二分法的递归算法代码如下:
  1. int search_recursive(int array[], int low, int high, int target)
  2. {
  3.     int middle = (int)((low + high) >> 1);

  4.     if(low <= high)
  5.     {
  6.         if(array[middle] < target)
  7.         {
  8.             return search_recursive(array, middle + 1, high, target);
  9.         }
  10.         else if(array[middle] > target)
  11.         {
  12.             return search_recursive(array, low, middle - 1, target);
  13.         }
  14.         else
  15.         {
  16.             return middle;
  17.         }
  18.     }

  19.     return -1;
  20. }
上述代码有可能有一些特殊情况问题,但大体应该是正确的,这里先不管了。
二分法的返回值为查找变量的出现的位置,上述代码虽然能够返回变量出现的位置,但是却不是该变量在有序数组中出现的第一个位置。为了让二分查找返回变量出现在有序数组中的第一个位置,如下述代码所示(其实这也是二分法的优化,感谢willgo)。
  1. int search(int array[], int len, int target)
  2. {
  3.     int low, high, middle;

  4.     low = -1, high = len;

  5.     while(low + 1 != high)
  6.     {
  7.         middle = (int)((low + high) >> 1);
  8.         if(array[middle] < target)
  9.         {
  10.             low = middle;
  11.         }
  12.         else
  13.         {
  14.             high = middle;
  15.         }
  16.     }
  17.     if(high == len || array[high] != target)
  18.     {
  19.         return -1;
  20.     }

  21.     return high;
  22. }

阅读(1996) | 评论(0) | 转发(0) |
0

上一篇:惨痛的腾讯面试

下一篇:筛法求素数

给主人留下些什么吧!~~