>第 11 章 排序与查找>归并排序

苦少 kushaobuy@163.com
2009-07-01 15:11:15

int n1 = mid - start + 1;
	int n2 = end - mid;
	int left[n1], right[n2];


你在第8章介绍数组说:“数组类型的长度应该用一个常量表达式来指定[14],而且这个常量表达式的值必须是整数类型的”

14 也说明了,可以用变量;"C99引入了新的特性,规定数组长度表达式也可以包含变量,称为变长数组(VLA,Variable Length Array),VLA只能定义为函数的局部变量,而不能定义为全局变量,与VLA有关的语法规则非常复杂,而且很多编译器不支持这种新特性,不建议使用。"

但是 还是建议你 改下这段代码。我执行你的代码 没有通过编译。


宋劲杉 songjinshan@akaedu.org
2009-07-12 13:15:10

Sorry, this won't change. 我还是想用VLA来举这个例子。请用gcc编译。


macunix portisere@qq.com
2009-07-24 23:02:18

提一个建议,这些代码没有合理的注释是难懂的


宋劲杉 songjinshan@akaedu.org
2009-07-25 15:44:47

我不喜欢啰里啰嗦。如果要注释,就不会有详细讲解;如果要详细讲解,就不会有注释。你要哪一个?


周建伟 zhoujianwei1986@126.com
2009-10-08 16:57:29

你这个程序怎么运行不出来呀?


laciqs 530107999@qq.com
2010-05-02 11:54:50

后面三个for循环合在一起看
应该是while循环


zq oilpangpang@hotmail.com
2010-05-28 22:57:31

宋老师:你的这段应该是错的吧,因为你
int left[n1]相当于int left[1],应该只有 left[0]才对呀。
         while (i < n1 && j < n2)
	if (left[i] < right[j])
	    a[k++] = left[i++];
	else
	    a[k++] = right[j++];


宋劲杉 songjinshan@gmail.com
2010-06-02 09:49:30

不明白你说的问题。要证我的程序是错的很简单,给出一个特殊的输入,在这个输入下程序会跑出不正确的结果,或者程序崩溃。


Louis alzl333@sina.com
2010-09-10 10:29:13

while (j < n2) /* right[] is not exhausted */
	a[k++] = right[j++];
----------
mid = (start + end) / 2取floor,数组第一个元素为0th。
想想什么情况下right[] will be exhausted?


usopp cuisanzhang@163.com
2011-06-24 04:18:30

#define LEN 8
sort(0, 8-1);
# sort(0, LEN-1); 
mid = (0 + 7) / 2;
#mid = (start + end) / 2;

请教(0 + 7) / 2;这样怎么除啊...


如果您有建设性意见,哪怕只是纠正一个错别字,也请不吝赐教,您留下的姓名和email将会出现在本书前言的致谢中。再次感谢您的宝贵意见!