需要帮助修复我的选择排序

时间:2016-04-07 23:54:50

标签: java

我的方法应该返回数组未排序部分中最大元素的位置,方法的第二个参数指定数组未排序部分结束的最大索引。我的testMaxPositionMiddle通过,但我的testMaxPositionFirst失败,我不明白为什么。

public Object maxPosition(int[] array, int x)
{

for( int i = 0; i < array.length - 1; i++)
{
    int maxPosition = i;
    for( int j = 0; j < array.length; j++)
    {
        if(array[j] > array[maxPosition])
        {
            maxPosition = j;
            return maxPosition;
        }
    }
}
return null;
}
@Test
public void testMaxPositionMiddle()
{
int[] x = { 1, 5, 3, 7, 8, 9};
MySorter s = new MySorter();
assertEquals(1, s.maxPosition(x,2));

}

@Test
public void testMaxPositionFirst()
{
int[] x = {5, 1, 3, 2, 8, 9};
MySorter s = new MySorter();
assertEquals(0, s.maxPosition(x, 3));

}

1 个答案:

答案 0 :(得分:1)

您的代码中有三个错误。

第一个是你实际上在整个数组中检查maxvalue而不是检查0 ..... x之间的值。因此,您应该将循环更改为循环遍历整个数组,但仅限于开头:

for(int i = 0; i <= x; i++){

}

你的第二个问题是,当你只需要一个循环时,你正在运行2个循环:检查最大值的循环。首先假设最大值是第一个(0)位置的值,然后每次找到更大的值时更新maxvalue。首先给maxPosition赋值0,作为循环前的起始值

int maxPosition = 0;

你的第三个问题是,如果第一个位置(0)实际包含正确的值,则maxPosition应该为0.

if(array[j] > array[maxPosition]){
    maxPosition = j;
    return maxPosition;
}

在这些行中,如果 更新,您将返回正确的maxPosition 。如果maxPosition为0,它将永远不会更新,然后你永远不会到达这一行:

return maxPosition;

相反,您将在函数末尾找到return语句,而是返回 null ,如下所示:

return null;

实际上你的代码甚至还有第四个错误。在此状态下,您将返回任何值,该值在开头大于maxPosition。

例如,如果您有一个列表(2,4,6),那么maxPosition在开始时将为0。 maxValue将是2,但这些代码行:

if(array[j] > array[maxPosition]){
    maxPosition = j;
    return maxPosition;
}
即使在值数组[1]&gt;的第二种情况下,

实际上会让你跳转到if语句中array [maxPosition],因为4> 2。因此,您的代码将返回maxPosition 1

你想要做的是从if语句中删除return语句,并且只为你的函数提供一个 return语句。这应该是在for-loop

之后的总函数的末尾