我遇到了以下伪代码。这里A
是一个整数数组:
for i = 1 to n
{
j = i; f = 1;
while ((j>1) and (f==1))
{
if (A[j]<A[j/2]) { swap(A[i], A[j/2]); j = j/2; }
else { f = 0; }
}
}
我无法理解为什么A
的最小元素总是进入A[1]
。
实际上我遇到了问题,这段代码如何更改A[1]
?或者至少我是否正确理解了这段代码的操作?
答案 0 :(得分:3)
即使不清楚整数除法应该如何工作(3/2 == 1
或3/2 == 2
?),算法也会始终将最小值移动到数组的第一个位置。
E.g。对于组成为{4,5,6,2}
的数组,最后一个元素将首先移动到第二个位置,第一个交换(j==4
和i==4
)导致这种情况:{4,2,6,5}
。
当j
更新为j/2 --> 2
时,数组2
的第二个元素将与索引j/2 --> 1
的第二个元素进行比较并移至第一个位置。在这里,分裂的问题上升了。
分部1/2
代表风险,因为它可以转换为0
,从而导致A[0]
的调用并产生ArrayOutOfBoundException
,但这是伪造的代码,如果你整理分裂的结果,它可以工作。