QuickSort IndexOutOfBound список исключений - PullRequest
0 голосов
/ 04 октября 2018

Здравствуйте, я пытаюсь закодировать QuickSort, однако я всегда встречаюсь с индексом за пределами?Мой код выглядит следующим образом:

public class QuickSort
{
    public void quickSort(ArrayList<Integer> A, int p, int r)
    {
        if (p < r) {
            int q = partition(A, p, r);
            quickSort(A, p, q - 1);
            quickSort(A, q + 1, r);
        }
    }
    public int partition(ArrayList<Integer> A, int p, int r) {
        int x = A.get(r);
        int i = p - 1;
        for (int j = p ; j < r; j++) {
            if (A.get(j) <= x) {
                i++;
                Collections.swap(A, A.get(i), A.get(j));
            }
        }
        Collections.swap(A, A.get(i + 1), A.get(r));
        return (i + 1);
    }
}

Я использую код из книги: «Введение в алгоритмы»

Я пытаюсь быстро отсортировать ArrayList A

public class TestDriver
{
    public static void testQuick() {
        //Laver et random array A
        ArrayList<Integer> A = new ArrayList<>();
        for (int i = 1; i <12; i++) {
            A.add(i);
        }
        Collections.shuffle(A);
        int n = A.size();
        QuickSort qs = new QuickSort();
        System.out.println("The Array");
        System.out.println(A);
        qs.quickSort(A, 0, (n - 1));
        System.out.println("The Array after QuickSort");
        System.out.println(A);
        System.out.println("");

    }
}

1 Ответ

0 голосов
/ 04 октября 2018

Проблема в Collections.swap(A, A.get(i), A.get(j)); - попытается использовать значение в A.get(i) в качестве индекса в вашем списке и, очевидно, выдает исключение за пределами границ, если значение в i больше A.size().

Поэтому замените их только теми позициями, которые вы хотите поменять местами:

Collections.swap(A, i, j);

и

Collections.swap(A, (i + 1), r);
...