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

47 lines
1.3 KiB
Plaintext
Raw Normal View History

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
}