Проблема, с которой вы столкнулись, начинается со следующей строки:
for (int i = start; i <= end; i++)
Причина очевидна из следующей строки кода:
for (int j = i+1; j > start; j--)
В этой строке вы инициализируете j
с i + 1
и последующей попыткой доступа к A[j]
в следующей строке.
Когда i
станет равным end
(поскольку вы записали условие завершения как i <= end
) j
будет равно end + 1
, т. Е. В случае вашего массива j
будет равно 10 + 1 = 11
. Однако последний индекс в A[]
равен 9
, так как вы уже должны знать, что индекс массива начинается с 0
. Всякий раз, когда вы пытаетесь получить доступ к элементу массива из индекса после последнего индекса, выдается ArrayIndexOutOfBoundsException .
Ниже приведен исправленный код:
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
int[] A = { 8, 6, 7, 9, 4, 8, 1, 4, 10, 3 };
int start = 0;
int end = A.length;
insertionSort(A, start, end);
System.out.println(Arrays.toString(A));
}
static void insertionSort(int[] A, int start, int end) {
for (int i = start; i < end - 1; i++) {
for (int j = i + 1; j > start; j--) {
if (A[j] < A[j - 1]) {
int k = j - 1;
swap(A, j, k);
}
}
}
}
static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
Выход:
[1, 3, 4, 4, 6, 7, 8, 8, 9, 10]