Возникла проблема с моей реализацией сортировки слиянием

#java #mergesort

#java #сортировка слиянием

Вопрос:

Я получаю ошибку out of bounds для моей реализации mergeSort , и я не могу понять, почему. Это точное сообщение об ошибке: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 1 out of bounds for length 1"

Вот моя реализация mergeSort :

 public static void mergeSort(int[] arr, int n) {
    if (n < 2) {
        return;
    }
    
    int mid_index = n / 2; 
    int[] left = new int[mid_index];
    int[] right = new int[n - mid_index];
    
    for (int i = 0; i < mid_index; i  ) {
        left[i] = arr[i];
    }
    
    for (int i = mid_index; i < n; i  ) {
        right[i - mid_index] = arr[i];
    }
    
    mergeSort(left, mid_index);
    mergeSort(right, n - mid_index);
    merge(arr, left, right, mid_index, n - mid_index);
}
    
public static void merge(int[] arr, int[] left, int[] right, int left_length, int right_length) {
    int i = 0;
    int j = 0; 
    int k = 0; 
    
    while (j < left_length amp;amp; k < right_length) {
        if (left[i] < right[j]) {
            arr[k] = left[i];
            k  ;
            i  ;
        } else {
            arr[k] = right[j];
            k  ;
            j  ;
        }
    }
    
    while (j < left_length) {
        arr[k] = left[i];
        k  ;
        i  ;
    }
    
    while (i < right_length) {
        arr[k] = right[j];
        k  ;
        j  ;
    }
} 
  

Комментарии:

1. Прочитайте эту статью , чтобы получить советы по отладке вашего кода.

2. В какой строке у вас есть ArrayIndexOutOfBoundsException?

Ответ №1:

Проблема была в merge методе. Вы допускаете некоторые ошибки с индексами. Я исправил их в коде ниже

 public static void merge(int[] arr, int[] left, int[] right, int left_length, int right_length){
    int i = 0;//left
    int j = 0; //right
    int k = 0; 
    
    while(i<left_length amp;amp; j < right_length){
        if(left[i] < right[j]){
            arr[k] = left[i];
            k  ;
            i  ;
        }
        else{
            arr[k] = right[j];
            k  ;
            j  ;
        }
    }
    
    while(i<left_length){
        arr[k] = left[i];
        k  ;
        i  ;
    }
    
    while(j<right_length){
        arr[k] = right[j];
        k  ;
        j  ;
        }
    } 
  

Комментарии:

1. @Nosrep Что такое OP?

2. Человек, который задал вопрос

3. Я вижу, что я случайно переключил i и j в последних 2 циклах while, но я все еще получаю ту же ошибку при запуске «Исключение в потоке «main» java.lang. Исключение ArrayIndexOutOfBoundsException: индекс 1 выходит за пределы длины 1″

4. Также изменение в while(i<left_length amp;amp; j < right_length){

Ответ №2:

Все 3 while цикла в merge методе используют неправильные индексные переменные. Первый цикл while (j < left_length amp;amp; k < right_length) { должен быть

     while (i < left_length amp;amp; j < right_length) {
  

Второй цикл while (j < left_length) { должен быть

     while (i < left_length) {
  

Наконец, последний цикл while (i < right_length) { должен быть

     while (j < right_length) {