QuickSort(select)方法,ArrayIndex超出界限错误

时间:2015-02-23 16:37:05

标签: java quicksort partition

我正在进行一项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。对不起,如果我听起来很傻,这是一个艰难的周末,上面是一个巨大的痛苦。

1 个答案:

答案 0 :(得分:1)

首先,此时调试此方法的最佳方法是在每个数组访问之前放置print语句,以打印正在查看的索引。这将立即告诉您错误发生的位置。以下是对可能发生的事情的猜测。可能还有其他罪魁祸首。

  1. 如果pivot是第一个或最后一个元素会发生什么(比如哪个元素总会发生在2个元素的数组中)?然后当您选择pivot + 1pivot - 1时,就像在select函数结束时一样,您将离开数组的末尾。或者在pivot - 1上进行分区时。看来你需要充实你的递归函数的基本情况。这是最有可能的罪魁祸首。

  2. 您根据整个数组的长度而不是子数组的长度(从firstlast而不是0来选择您的数据透视表到arr.length。如果firstlast一直是整个数组的第一个也是最后一个元素,那么我怀疑这是问题所在(尽管在更彻底地测试时它仍然是个问题)。