我不知道为什么,但是当我编译它时,这一直给我一个数组越界错误。假设数组被正确初始化以具有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;
}
答案 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 = -1
和while(temp1 <= temp2)
。现在你检查:
if(low < temp1)
{
sort(low, temp2);
}
由于low = 0
小于temp1 = 1
,sort
将使用sort(0, -1)
调用,这将发出超出范围的异常。 :)