Я работаю над заданием coms и ударил огромную стену. Мы работаем с quicksort/partition.Метод QuickSort (выберите), ошибка ArrayIndex за пределами
/**
* 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);
}
}
Вышеупомянутый метод 'select', я считаю, что это реализация quicksort. Когда я запускаю его с помощью моего метода разбиения, я постоянно получаю ошибки в ArrayIndex из-за пределов, мне интересно, вызвали ли эти ошибки мои ошибки ...
Ниже представлен раздел и метод обмена I написал. Метод разбиения работает из того, что я могу сказать, я сделал int [] из 10 и запускал его несколько раз, используя разные опорные точки. Каждый раз, когда он выкидывал, аран сортировал так, как должно быть.
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. Извините, если я все время вспоминаю, это были грубые выходные, и вышеупомянутое было огромной болью.
Вот совет: если вы не можете понять, что происходит, поместите некоторые инструкции System.out.println в код в критических точках (например, точки ввода метода); распечатайте важные значения, а затем попытайтесь посмотреть, что на самом деле происходит. – rghome