Ошибка в рекурсивной сортировке выбором?

Я пытаюсь рекурсивно реализовать сортировку выбором в java, но моя программа продолжает выдавать исключение ArrayIndexOutOfBounds. Не уверен, что я делаю неправильно. Рекурсия дается мне очень тяжело. Пожалуйста помоги! Я начинающий.

public static int[] selection(int[] array) {
    return sRec(array, array.length - 1, 0);
}
private static int[] sRec(int[] array, int length, int current) {
    if (length == current) { //last index of array = index we are at
        return array; //it's sorted
    }
    else {
            int index = findBig(array, length, current, 0);
            int[] swapped = swap(array, index, length - current);
            return sRec(swapped, length - 1, current);
    }
}

private static int[] swap(int[] array, int index, int lastPos) {
    int temp = array[lastPos];
    array[lastPos] = array[index];
    array[index] = array[temp];
    return array;
}

private static int findBig(int[] array, int length, int current, int biggestIndex) {
    if (length  == current) {
        return biggestIndex;
    }
    else if (array[biggestIndex] < array[current]) {
        return findBig(array, length, current + 1, current);
    }
    else {
        return findBig(array, length, current + 1, biggestIndex);
    }
}

public static void main (String [] args) {
    int[] array = {8,3,5,1,3};
    int[] sorted = selection(array);
    for (int i = 0; i < sorted.length; i++) {
        System.out.print(sorted[i] + " ");
    }
}

person taralee98    schedule 07.12.2018    source источник


Ответы (2)


Я проверил ваш код, и он не сортировался даже после исправления «Исключения вне границ». Я изменил ваш метод findBig, чтобы он работал. Принцип таков:

  1. Если длина вложенного массива равна единице (начало==конец), то самым большим элементом является массив[начало]
  2. разделить массив пополам
  3. Recusively найти индекс самого большого элемента в левой части
  4. Рекурсивно найти индекс, если самый большой элемент справа
  5. Сравните самый большой элемент левой части с правой частью массива и верните индекс наибольшего из них обоих.

Это приводит к следующему коду, который сортирует массив в порядке убывания:

public class Sort {

   public static int[] selection(int[] array) {
        return sRec(array,0);
    }
    private static int[] sRec(int[] array, int current) {
      if (current == array.length-1) { //last index of array = index we are at
            return array; //it's sorted
        }
        else {
                int indexOfBiggest = findBig(array, current,array.length-1);
                int[] swapped = swap(array, indexOfBiggest, current );
                return sRec(swapped, current+1);
        }
    }

    private static int[] swap(int[] array, int index, int lastPos) {
        int temp = array[lastPos];
        array[lastPos] = array[index];
        array[index] = temp;
        return array;
    }

    private static int findBig(int[] array, int begin, int end) {
        if (begin < end) {
            int middle = (begin+end)/2;
            int biggestLeft = findBig(array,begin,middle);
            int biggestRight = findBig(array,middle+1,end);
            if(array[biggestLeft] > array[biggestRight]) {
                return biggestLeft;
            }else {
                return biggestRight;
            }
        }else {
            return begin;
        }
     }

    public static void main (String [] args) {
        int[] array = {8,3,5,1,3};
       // System.out.println(findBig(array,0,array.length-1));
        int[] sorted = selection(array);
        for (int i = 0; i < sorted.length; i++) {
            System.out.print(sorted[i] + " ");
        }
    }
}
person florex    schedule 07.12.2018

Попробуйте изменить это в методе Swap:

int temp = array[lastPos];
array[lastPos] = array[index];
array[index] = array[temp];
return array;

к этому :

int temp = array[lastPos];
array[lastPos] = array[index];
array[index] = temp;
return array;

Вы уже получили значение, которое хотите присвоить массиву, когда вы добавляете его в массив, который он ищет в этом конкретном индексе,

Например :

Вы хотели ввести значение 8 в свой массив

Вместо того, чтобы делать

array[index] = 8

Ты делал

array[index] = array[8]

Это вызывало ваше исключение OutOfBounds.

person N.Georgakopoulos    schedule 07.12.2018
comment
Это исправило индекс за пределы, но теперь я вижу, что код помещает все в основном не по порядку, кроме первой цифры :( знаете ли вы, что может быть причиной этой проблемы? - person taralee98; 07.12.2018
comment
Вы можете найти свое решение в ответе ниже. Однако, если вы хотите немного исследовать себя, попробуйте распечатать массив после каждой рекурсии, вы увидите, в чем проблема. - person N.Georgakopoulos; 07.12.2018