《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);
}
错,于已可以尽量避免,于人尽量宽容。