2016-06-21 20:15:19 -04:00
|
|
|
public void quick() {
|
2016-07-03 11:28:26 -04:00
|
|
|
// Llamar al metodo recursivo.
|
|
|
|
recurenciaQuick(0, elementos - 1);
|
2016-06-21 20:15:19 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
private void recurenciaQuick(int izquerda, int derecha) {
|
2016-07-03 11:28:26 -04:00
|
|
|
if (derecha - izquerda <= 0) {
|
|
|
|
// Si derecha es menor que izquerda ya terminó.
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
int pivot = array[derecha];
|
2016-06-21 20:15:19 -04:00
|
|
|
|
2016-07-03 11:28:26 -04:00
|
|
|
int particion = particionar(izquerda, derecha, pivot);
|
|
|
|
recurenciaQuick(izquerda, particion - 1);
|
|
|
|
recurenciaQuick(particion + 1, derecha);
|
|
|
|
}
|
2016-06-21 20:15:19 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
private int particionar(int izquerda, int derecha, int pivot) {
|
2016-07-03 11:28:26 -04:00
|
|
|
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);
|
2016-06-21 20:15:19 -04:00
|
|
|
|
2016-07-03 11:28:26 -04:00
|
|
|
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;
|
2016-06-21 20:15:19 -04:00
|
|
|
|
2016-07-03 11:28:26 -04:00
|
|
|
// Devolver la posición donde terminó.
|
|
|
|
return punteroIzquerda;
|
2016-06-21 20:15:19 -04:00
|
|
|
}
|