折半查找

来源:互联网 发布:北京招聘ios程序员 编辑:程序博客网 时间:2024/06/06 05:17

设两个变量left和right分别表示被查找表的左边界和右边界,初始化时,left=0,right=n-1。令middle=(left+right)/2为list的中间位置。如果将list[middle]与需要查找的数searchnum做比较,则会出现下列3种情况。

  1. searchnum < list[middle]。把查找右边界right设置为middle - 1。
  2. searchnum = list[middle]。返回middle
  3. searchnum > list[middle]。把查找左边界left设置为middle + 1。

迭代:

#define COMPARE(x,y) (((x) < (y))? -1: ((x) == (y)) ? 0 : 1)int binsearch(int list[], int searchnum, int left, int right){    int middle;    while(left <= right)    {        middle = (left + right) / 2;        switch(COMPARE(list[middle],searchnum))        {            case -1:                left = middle + 1;                break;            case 0:                return middle;            case 1:                right = middle - 1;                break;        }    }}

递归:

#define COMPARE(x,y) (((x) < (y))? -1: ((x) == (y)) ? 0 : 1)int binsearch(int list[], int searchnum, int left, int right){    int middle;    if(left <= right)    {        middle = (left + right) / 2;        switch(COMPARE(list[middle],searchnum))        {            case -1:                return binsearch(list, searchnum, middle + 1, right)            case 0:                return middle;            case 1:                return binsearch(list, searchnum, left, middle - 1)        }    }    return -1;}


 

0 0
原创粉丝点击