¿Error en la selección recursiva?

Estoy tratando de implementar el orden de selección de forma recursiva en Java, pero mi programa sigue lanzando una excepción ArrayIndexOutOfBounds. No estoy seguro de lo que estoy haciendo mal. La recursión es muy difícil para mí. ¡Por favor ayuda! Soy un principiante.

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] + " ");
    }
}
Respuesta 1

Probé su código y no se ordenó incluso después de haber solucionado la "Excepción fuera de límite". He cambiado su método findBig para que funcione. El principio es:

  1. Si la longitud de la submatriz es una (comienzo == fin), el elemento más grande es la matriz [comenzar]
  2. dividir la matriz por la mitad
  3. Encuentra el índice del elemento más grande en el lado izquierdo
  4. Encuentre recursivamente el índice si el elemento más grande en el lado derecho
  5. Compare el elemento más grande del lado izquierdo con el del lado derecho de la matriz y devuelva el índice del más grande de ambos.

Esto lleva al siguiente código que ordena la matriz en orden decreciente:

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] + " ");
        }
    }
}
Respuesta: 2

Me preguntaba cómo funcionan los applets de Java con respecto al acceso a los datos en la PC de un usuario. Por ejemplo, deseo tomar un archivo en su PC y enviarlo al servidor web que aloja mi página web (básicamente un simple ...

Hola chicos, ¿hay alguna manera de contar la cantidad de niños en Firebase? Tengo una estructura de base de datos como esta Testitem1 {test: ""}, Testitem2 {test: ""} Quiero contar solo los nodos Testitem

Actualmente estoy usando la biblioteca jackson gwt y me preguntaba cómo puedo acceder a los valores que están anidados dentro de una cadena json. Mi código de configuración actual se ve así: interfaz estática pública ...

Soy nuevo en Java y paquetes y necesito ayuda para navegarlos. Actualmente tengo un programa java en funcionamiento para una aplicación web donde todos mis archivos .java y .class se encuentran en myapp / WEB-INF / classes ...