【发布时间】:2021-10-26 15:26:13
【问题描述】:
这是我提出的 QuickSort Randomized,但它不断抛出 IndexOutOfBounds 异常。我可以帮忙吗?谢谢!
import java.util.Random;
public class QuickSort {
void quickSort(int[] A, int start, int end) { // Initially: start = 0, end = n-1
while (start < end) {
int iOfPartition = randomisedPartition(A, start, end);
if (iOfPartition - start < end - iOfPartition) {
quickSort(A, start, iOfPartition - 1);
start = iOfPartition + 1;
} else {
quickSort(A, iOfPartition + 1, end);
end = iOfPartition - 1;
}
}
}
int randomisedPartition(int[] A, int start, int end) {
Random rng = new Random();
int randomNum = rng.nextInt(end + 1 - start) + start;
swap(A, A[randomNum], A[start]);
return hoarePartition(A, start, end);
}
int hoarePartition(int[] A, int start, int end) {
int pivot = A[start];
int i = start;
int j = end;
while (i < j) {
while (A[i] <= pivot && i < end) i++;
while (A[j] > pivot && j > start) j--;
if (i < j) swap(A, A[i], A[j]);
}
swap(A, A[start], A[j]);
return j;
}
void swap(int[] A, int i, int j) {
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
}
我不断收到 arrayindexoutofbounds 错误。
【问题讨论】:
-
您能否分享异常的堆栈跟踪以及每个函数的作用的 cmets 会有所帮助
-
我更喜欢给你一根鱼竿而不是一条鱼。我知道这是一种学习过程,因为通常你永远不会为已经实现多年(并且工作正常)的东西编写自己的代码。由于 qsort 本质上是递归的,因此您需要做的就是在您的 quickSort 方法开始时在某个地方(通过 system.out.println 或其他)调试或写入后续调用。您将立即看到小于零或大于数组长度的值,因为这就是此异常的全部内容。祝你好运!
-
在
hoarePartition()中,i应该从start+1开始,而不是start-start是枢轴槽。此外,如果i和j交叉(相遇),whiles 可以终止。 -
@500-InternalServerError 谢谢大家,但在这里我认为 i=start+1 没关系?因为我的 A[i]
-
@Roo:你是对的。
pivot和A[start]之间的第一个比较是多余的,但没什么大不了的。
标签: java random quicksort indexoutofboundsexception arrayindexoutofboundsexception