我正在测试一些函数的速度,所以我做了一遍又一遍地运行函数的测试,并将结果存储在一个数组中。我需要按随机生成的数组大小对它们进行排序。我生成了100个元素。合并到救援!我使用了this link to get me started。
我关注的代码部分:
private void mergesort(int low, int high) {
// check if low is smaller then high, if not then the array is sorted
if (low < high) {
// Get the index of the element which is in the middle
int middle = low + (high - low) / 2;
// Sort the left side of the array
mergesort(low, middle);
// Sort the right side of the array
mergesort(middle + 1, high);
// Combine them both
merge(low, middle, high);
}
}
转换为VB.NET的是
private sub mergesort(low as integer, high as integer)
' check if low is smaller then high, if not then the array is sorted
if (low < high)
' Get the index of the element which is in the middle
dim middle as integer = low + (high - low) / 2
' Sort the left side of the array
mergesort(low, middle)
' Sort the right side of the array
mergesort(middle + 1, high)
' Combine them both
merge(low, middle, high)
end if
end sub
更重要的是,只关注这个问题的LOC是
dim middle as integer = low + (high - low) / 2
如果你想看看合并排序将如何运行这个宝贝
high low high low
100 0 10 0
50 0 6 4
25 0 5 4
12 0 12 7
6 0 10 7
3 0 8 7
2 0 :stackoverflow error:
错误来自事实7 +(8 - 7)/ 2 = 8.你会看到7和8传入mergesort(低,中)然后我们无限循环。现在早些时候你会再次看到这样的比较。在5和4. 4 +(5 - 4)/ 2 = 4.因此基本上对于5和4它变为4 +(1)/ 2 = 4.5 = 4.对于8和7虽然它是7 +(1)/ 2 = 7.5 = 8.记住数字被类型化为int。
也许我只是使用了一个不好的实现,或者我的类型转换是错误的,但我的问题是:这不应该是一个红旗,表明发生了舍入的事情是不正确的吗?
答案 0 :(得分:3)
如果不了解整个算法,请注意VB.NET /
与C#/
不同。后者默认为整数除法,如果你想在VB.NET中截断小数位,你必须使用\
。
阅读:\ Operator
所以我认为这就是你想要的:
Dim middle as Int32 = low + (high - low) \ 2
答案 1 :(得分:0)
你的诊断是正确的:有些东西与正在发生的舍入不一致,但如果你知道在哪里看,这是完全可以预期的。
来自VB.NET documentation on the /
operator:
除以两个数字并返回浮点结果。
此文档明确指出,如果x
和y
是整数类型,x / y
会返回Double
。因此,VB.NET中的5 / 2
应该是2.5
。
来自C# documentation on the /
operator:
所有数字类型都有预定义的除法运算符。
在页面的下方:
当你除以两个整数时,结果总是一个整数。
对于C#,如果x
和y
是整数,x / y
将返回一个整数(向下舍入)。 C#中的5 / 2
预计会返回2
。