int n1 = mid - start + 1; int n2 = end - mid; int left[n1], right[n2]; 你在第8章介绍数组说:“数组类型的长度应该用一个常量表达式来指定[14],而且这个常量表达式的值必须是整数类型的” 14 也说明了,可以用变量;"C99引入了新的特性,规定数组长度表达式也可以包含变量,称为变长数组(VLA,Variable Length Array),VLA只能定义为函数的局部变量,而不能定义为全局变量,与VLA有关的语法规则非常复杂,而且很多编译器不支持这种新特性,不建议使用。" 但是 还是建议你 改下这段代码。我执行你的代码 没有通过编译。
Sorry, this won't change. 我还是想用VLA来举这个例子。请用gcc编译。
提一个建议,这些代码没有合理的注释是难懂的
我不喜欢啰里啰嗦。如果要注释,就不会有详细讲解;如果要详细讲解,就不会有注释。你要哪一个?
你这个程序怎么运行不出来呀?
后面三个for循环合在一起看 应该是while循环
宋老师:你的这段应该是错的吧,因为你
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++];不明白你说的问题。要证我的程序是错的很简单,给出一个特殊的输入,在这个输入下程序会跑出不正确的结果,或者程序崩溃。
while (j < n2) /* right[] is not exhausted */ a[k++] = right[j++]; ---------- mid = (start + end) / 2取floor,数组第一个元素为0th。 想想什么情况下right[] will be exhausted?
#define LEN 8 sort(0, 8-1); # sort(0, LEN-1); mid = (0 + 7) / 2; #mid = (start + end) / 2; 请教(0 + 7) / 2;这样怎么除啊...
如果您有建设性意见,哪怕只是纠正一个错别字,也请不吝赐教,您留下的姓名和email将会出现在本书前言的致谢中。再次感谢您的宝贵意见!