Chinaunix首页 | 论坛 | 博客
  • 博客访问: 18043
  • 博文数量: 3
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-21 22:19
文章分类

全部博文(3)

文章存档

2009年(1)

2008年(2)

我的朋友
最近访客

分类: C/C++

2009-05-10 12:57:20

最近打算好好从C语言基础学起,在网上找到本《The C Programming Language》第二版电子书,Dennis Ritchie & Brian Kernighan合著。

读到第三章时,讲到一个二分法的搜索函数,测试了一下原书代码,如下:

/* binsearch: find x in v[0] <= v[1] <= .. <= v[n-1] */
int binsearch(int x, int v[], int n)
{
    int low, high, mid;

    low = 0;
    high = n - 1;
    while (low <= high) {
        mid = (low+high)/2;
        if (x < v[mid])
            high = mid + 1;
        else if (x > v[mid])
            low = mid + 1;
        else /* found match */
            return mid;
    }
    return -1; /* no match */
}


随机给一个数组赋值,然后用冒泡算法给数组排序,再让这个binsearch函数给数组排序,发现有时候,当数组中没有要搜索的值时,即binsearch函数的第一个参数x值,数组中没有这个x值,函数会陷入死循环,到网上一搜,看到这么一篇文章[1],里面讲了二分法的问题,也给了一些示例代码,这才看到,是binsearch的代码有点小问题,即high = mid + 1;这行代码,应该是high = mid - 1;

重新再修改好代码,以下是正确的binsearch算法。

/* binsearch: find x in v[0] <= v[1] <= .. <= v[n-1] */
int binsearch(int x, int v[], int n)
{
    int low, high, mid;

    low = 0;
    high = n - 1;
    while (low <= high) {
        mid = (low+high)/2;
        if (x < v[mid])
            high = mid - 1;
        else if (x > v[mid])
            low = mid + 1;
        else /* found match */
            return mid;
    }
    return -1; /* no match */
}


一切都正常了。

参考文章:
[1]
二分法——查找、排序以及库函数bsearch的用法
http://blog.csdn.net/douzixinxin/archive/2006/02/21/604144.aspx
阅读(582) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

nmap2010-05-01 11:18:52

哦,多谢了,扫描版的电子书有时候不清楚。

chinaunix网友2010-02-24 19:06:56

应该是电子版书的问题,实体书没这个问题呢。。