数组超出界限错误,快速排序

时间:2014-10-13 09:39:24

标签: java arrays quicksort

我不知道为什么,但是当我编译它时,这一直给我一个数组越界错误。假设数组被正确初始化以具有10个索引位置并且我传递给方法0和numbers.length - 1,我做错了什么?

public void sort(int low, int high)
{
    int temp1 = low;
    int temp2 = high;
    int pivot = numbers[low + (high - low)/2];

    while(temp1 <= temp2)
    {
        while(numbers[temp1] < pivot)
        {
            temp1++;
        }
        while(numbers[temp2] > pivot)
        {
            temp2--;
        }
        if(temp1 <= temp2)
        {
            swap(temp1, temp2);
            temp1++;
            temp2--;
        }
    }
    if(low < temp1)
    {
        sort(low, temp2);
    }
    if(temp2 < high)
    {
        sort(temp2, high);
    }
}

public void swap(int temp1, int temp2)
{
    int temp = numbers[temp1];
    numbers[temp1] = numbers[temp2];
    numbers[temp2] = temp;
}

3 个答案:

答案 0 :(得分:0)

此:

if(low < temp1)
{
    sort(low, temp2);
}

应该是

if(low < temp2)
{
    sort(low, temp2);
}

而且:

if(temp2 < high)
{
    sort(temp2, high);
}

应该是:

if(temp1 < high)
{
    sort(temp1, high);
}

这并不能解释您所看到的错误,但是您要对太多的子阵列进行排序。您不需要在递归排序中包含透视值;它已经在正确的位置。

此外:

while(temp1 <= temp2)

可能是:

while(temp1 < temp2)

...因为尝试与自己交换元素没有意义。但是这可能会使循环返回temp1 == temp2,在这种情况下,您可能希望调整以后的递归调用;所以也许将条件保留为temp1 <= temp2是一个更好的选择。

答案 1 :(得分:0)

您正在比较temp1与temp2,而您应该比较数字[temp1]和数字[temp2]。那个比较(如果(temp1&lt; = temp2))和之后的交换可能导致temp1超过数组大小。

答案 2 :(得分:0)

我认为davmac的答案是正确的! 但是我想指出为什么你出界了!

假设使用sort调用sort(0, 1),然后,如果numbers[1] > numbers[0],我们将在循环temp1 = 1之后获得temp2 = -1while(temp1 <= temp2)。现在你检查:

if(low < temp1)
    {
        sort(low, temp2);
    }

由于low = 0小于temp1 = 1sort将使用sort(0, -1)调用,这将发出超出范围的异常。 :)