出版社的一个错误

来源:互联网 发布:嘉兴市行知小学怎么样 编辑:程序博客网 时间:2024/04/30 00:52

 《C程序设计语言》一书上的一个“快速算法”的实现好像是一个错的。我昨天晚上在机器上做了一遍,结果是错的。昨天花了一整天的时间来研究这个“快速算法”。查了不少的书。唯独K&R的这本《C程序设计语言》这本书上的“快速算法”有点怪。其效率差得出奇--我在纸上演示过。但严蔚敏的《数据结构--C语言描述》这本书上对“快速算法”的阐述要清楚多了,还查了几本书,都与严的书上的精神大致相同。我晚上在Turbo C 2.0和Dev-C++上做了,还是错的。今天早上在网上查了中文译版的,跟我书上的一模一样,又下载了一本英文版的,还是一模一样……

还是在努力想想,或者是我错了呢;要是真的作者错了。我还可以把它改过来。

几天过去了……

《C程序设计》(中文版)中P73页中的那个快速算法是印错的,而不是作者K&R的错。今天,我在英文原版中对照看才知道的。

原版中这个程序如下:
void q_sort(int v[], int left, int right)
{
    int i, last;
    void swap(int v[], int i, int j);

    if (left >= right) /* do nothing if array contains */
        return;        /* fewer than two elements */
    swap(v, left, (left + right) / 2); /* move partition elem */
    last = left;                       /* to v[0] */
    for (i = left + 1; i <= right; i++) /* partition */
        if (v[i] < v[left])
            swap(v, ++last, i);
    swap(v, left, last);               /* restore partition elem */
    q_sort(v, left, last - 1);
    q_sort(v, last + 1, right);
}

而中文版中如下:
void q_sort(int v[], int left, int right)
{
    int i, last;
    void swap(int v[], int i, int j);

    if (left >= right) /* do nothing if array contains */
        return;        /* fewer than two elements */
    swap(v, left, (left + right) / 2); /* move partition elem */
    last = left;                       /* to v[0] */
    for (i = left + 1; i <= right; i++) /* partition */
        if (v[i] < v[left])
    swap(v, ++last, i);

    /* 这个last已经错印成right了 */
    swap(v, left, right);   /* restore partition elem */
    q_sort(v, left, last - 1);
    q_sort(v, last + 1, right);
}


错,于已可以尽量避免,于人尽量宽容。