Algoritmo de selección devuelve resultados incorrectos a veces

Para un problema de tarea, necesito escribir un método Java para encontrar el késimo número más pequeño en una matriz, usando una partición de estilo de clasificación rápida. Me dieron el método de partición (), y se supone que debo escribir el método para obtener el késimo número más pequeño.

El problema requiere que el pivote sea siempre el elemento más a la derecha en el rango de la matriz.

Me dieron lo siguiente:

public int partition(int left, int right, long pivot) {
    int leftPtr = left - 1;
    int rightPtr = right + 1;
    while (true) {
        while (leftPtr < right && array[++leftPtr] < pivot); 
        while (rightPtr > left && array[--rightPtr] > pivot);

        if (leftPtr >= rightPtr)
            break;
        else
            swap(leftPtr, rightPtr);
    }
    return leftPtr;
}

Y he escrito este método basado en el pseudocódigo de Wikipedia :

public int kthSmallest(int left, int right, int k){
    if(left >= right){
        return array[left];
    }

    int pivotNewIndex = partition(left, right, array[right]);

    int pivotDist = pivotNewIndex - left - 1;

    if(pivotDist == k){
        return array[pivotNewIndex];
    } else if(k < pivotNewIndex){
        return kthSmallest(k, left, pivotNewIndex - 1);
    } else{
        return kthSmallest(k - pivotDist, pivotNewIndex + 1, right);
    }
}

Pero cuando llamo kthSmallest()con matrices de enteros generados aleatoriamente, aproximadamente la mitad del tiempo devuelve el valor incorrecto. Por ejemplo:

array: [45, 60, 24, 82, 87, 79, 16, 32, 59, 83, 20, 2, 1, 
         50, 11, 79, 72, 32, 0, 48, 69, 74, 22, 6, 96]
expected result when k=4: 11
actual result when k=4: 87

¿Qué estoy haciendo mal?

Respuesta 1

Sus llamadas recursivas tienen la lista de argumentos en el orden incorrecto. La posición en el subconjunto que estás viendo debería ser el tercer argumento, no el primero.

Respuesta: 2

Mire de cerca sus llamadas recursivas para kthSmallest en comparación con el pseudocódigo de wikipedia. ¿Dónde está el argumento del índice k relativo?

Respuesta: 3

Cifrado de clase pública {private static final int [] encrypt = {2, 9, 3, 4, 6, 8, 1, 0}; privado estático final int [] descifrar = nuevo int [8]; privado estático final int minLength = 10; Cadena encriptada (...

Estoy tratando de convertir una cadena específica en un byte []. La cadena se ve así: 55 55 F5 FF FF y aquí está el método que escribí para ello, espero que alguien pueda decirme qué está mal o tiene una mejor solución. ...

No tengo que poder editarlo en Windows, pero sí tengo que poder ejecutar el programa creado con la versión mac de Eclipse en Windows. es posible?

Tengo un simple objeto Java String y quiero serializarlo / deserializarlo, usando XStream. La serialización funciona bien, pero como esta cadena escrita, digamos, en ruso, después de la deserialización descubro que ...