简单的代码和操作挑战(附图)

时间:2014-09-05 08:32:53

标签: algorithm programming-languages code-analysis

我遇到了以下伪代码。这里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]?或者至少我是否正确理解了这段代码的操作?

1 个答案:

答案 0 :(得分:3)

即使不清楚整数除法应该如何工作(3/2 == 13/2 == 2?),算法也会始终将最小值移动到数组的第一个位置。

E.g。对于组成为{4,5,6,2}的数组,最后一个元素将首先移动到第二个位置,第一个交换(j==4i==4)导致这种情况:{4,2,6,5}。 当j更新为j/2 --> 2时,数组2的第二个元素将与索引j/2 --> 1的第二个元素进行比较并移至第一个位置。在这里,分裂的问题上升了。

分部1/2代表风险,因为它可以转换为0,从而导致A[0]的调用并产生ArrayOutOfBoundException,但这是伪造的代码,如果你整理分裂的结果,它可以工作。