我正在进行一项coms任务并且遇到了巨大的障碍。我们正在使用quicksort / partition。
/**
* An implementation of the SELECT algorithm of Figure 1 of the project
* specification. Returns the ith order statistic in the subarray
* arr[first], ..., arr[last]. The method must run in O(n) expected time,
* where n = (last - first + 1).
*
* @param arr
* - The data to search in
* @param first
* - The leftmost boundary of the subarray (inclusive)
* @param last
* - The rightmost boundary of the subarray (inclusive)
* @param i
* - The requested order statistic to find
* @return - The ith order statistic in the subarray
*
* @throws IllegalArgumentException
* - If i < 1 or i > n
*/
public static int select(int[] arr, int first, int last, int i) {
if(first == last){
return first;
}
int pivot = (arr.length / 2);
pivot = partition(arr, first, last, pivot-1);
if(i == pivot){
return arr[i];
} else if(i < pivot){
return select(arr, first, pivot-1, i);
} else {
return select(arr, pivot+1, last, i);
}
}
以上是选择&#39;方法,我相信它是quicksort的一个实现。当我使用我的分区方法运行它时,我不断收到ArrayIndex错误的界限,我想知道我选择我的枢轴的方式是否导致这些错误......
以下是我编写的分区和交换方法。分区方法可以解释,我创建了一个10的int []并使用不同的轴点多次运行它。每次它抛出arr就按照应该的方式排序。
public static int partition(int[] arr, int first, int last, int pivot){
int pValue = arr[pivot];
swap(arr, last, pivot);
int temp = first;
for (int i = first; i < last; i++) {
if(arr[i] < pValue){
swap(arr, temp, i);
temp++;
}
}
swap(arr, last, temp);
return arr[pivot];
}
public static void swap(int[] arr, int a, int b){
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
其余的任务建立在选择方法的基础之上,而且我一直抨击我进入墙壁两天以使其正常工作......实际上我在第二次猜测我的选择学位。我想作为一个次要问题,你们中有多少人打过这些墙,对自己失去了信心?最后的几个任务,有点帮助,有道理,但现在我在这里,只是在黑暗中迷失...
PS。对不起,如果我听起来很傻,这是一个艰难的周末,上面是一个巨大的痛苦。
答案 0 :(得分:1)
首先,此时调试此方法的最佳方法是在每个数组访问之前放置print语句,以打印正在查看的索引。这将立即告诉您错误发生的位置。以下是对可能发生的事情的猜测。可能还有其他罪魁祸首。
如果pivot是第一个或最后一个元素会发生什么(比如哪个元素总会发生在2个元素的数组中)?然后当您选择pivot + 1
或pivot - 1
时,就像在select函数结束时一样,您将离开数组的末尾。或者在pivot - 1
上进行分区时。看来你需要充实你的递归函数的基本情况。这是最有可能的罪魁祸首。
您根据整个数组的长度而不是子数组的长度(从first
到last
而不是0
来选择您的数据透视表到arr.length
。如果first
和last
一直是整个数组的第一个也是最后一个元素,那么我怀疑这是问题所在(尽管在更彻底地测试时它仍然是个问题)。