Estructuras_de_Datos/src/cl/cromer/estructuras/code/quick/ordenar

47 lines
1.3 KiB
Plaintext

public void quick() {
// Llamar al metodo recursivo.
recurenciaQuick(0, elementos - 1);
}
private void recurenciaQuick(int izquerda, int derecha) {
if (derecha - izquerda <= 0) {
// Si derecha es menor que izquerda ya terminó.
return;
}
else {
int pivot = array[derecha];
int particion = particionar(izquerda, derecha, pivot);
recurenciaQuick(izquerda, particion - 1);
recurenciaQuick(particion + 1, derecha);
}
}
private int particionar(int izquerda, int derecha, int pivot) {
int punteroIzquerda = izquerda-1;
int punteroDerecha = derecha;
while (true) {
// Sumar el punteroIzquerda hasta que es igual al pivot
while (array[++punteroIzquerda] < pivot);
// Restar el puntoDerecha hasta que es igual a pivot o hasta 0.
while (punteroDerecha > 0 && array[--punteroDerecha] > pivot);
if (punteroIzquerda >= punteroDerecha) {
// Si el puntero izquerda es mayor o igual a la derech termina el while.
break;
}
else {
// Intercambiar los valores.
int temp = array[punteroIzquerda];
array[punteroIzquerda] = array[punteroDerecha];
array[punteroDerecha] = temp;
}
}
// Intercambiar los valores.
int temp = array[punteroIzquerda];
array[punteroIzquerda] = array[derecha];
array[derecha] = temp;
// Devolver la posición donde terminó.
return punteroIzquerda;
}