Skip to content

Instantly share code, notes, and snippets.

@parzibyte
Created December 26, 2019 22:28
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save parzibyte/a7114a58f26bb0c280f300d538fb9693 to your computer and use it in GitHub Desktop.
Save parzibyte/a7114a58f26bb0c280f300d538fb9693 to your computer and use it in GitHub Desktop.
/*
* Archivo: QuickSort.java
* Clase: QuickSort
* Autor: parzibyte
* Fecha: 12/26/19 4:07 PM
* Visita https://parzibyte.me/blog para más tutoriales sobre Java
*/
import java.util.Arrays;
public class QuickSort {
public static void main(String[] args) {
int numeros[] = {1, 9, 23, 4, 55, 100, 1, 1, 23};
System.out.println("Antes de QS: " + Arrays.toString(numeros));
quicksort(numeros, 0, numeros.length - 1);
System.out.println("Después de QS: " + Arrays.toString(numeros));
String[] nombres = {"Leon", "Chris", "Jill", "Wesker", "Ada"};
System.out.println("Antes de QS: " + Arrays.toString(nombres));
quicksort(nombres, 0, nombres.length - 1);
System.out.println("Después de QS: " + Arrays.toString(nombres));
}
private static int particion(int arreglo[], int izquierda, int derecha) {
// Elegimos el pivote, es el primero
int pivote = arreglo[izquierda];
// Ciclo infinito
while (true) {
// Mientras cada elemento desde la izquierda esté en orden (sea menor que el
// pivote) continúa avanzando el índice
while (arreglo[izquierda] < pivote) {
izquierda++;
}
// Mientras cada elemento desde la derecha esté en orden (sea mayor que el
// pivote) continúa disminuyendo el índice
while (arreglo[derecha] > pivote) {
derecha--;
}
/*
Si la izquierda es mayor o igual que la derecha significa que no
necesitamos hacer ningún intercambio
de variables, pues los elementos ya están en orden (al menos en esta
iteración)
*/
if (izquierda >= derecha) {
// Indicar "en dónde nos quedamos" para poder dividir el arreglo de nuevo
// y ordenar los demás elementos
return derecha;
} else {//Nota: yo sé que el else no hace falta por el return de arriba, pero así el algoritmo es más claro
/*
Si las variables quedaron "lejos" (es decir, la izquierda no superó ni
alcanzó a la derecha)
significa que se detuvieron porque encontraron un valor que no estaba
en orden, así que lo intercambiamos
*/
int temporal = arreglo[izquierda];
arreglo[izquierda] = arreglo[derecha];
arreglo[derecha] = temporal;
/*
Ya intercambiamos, pero seguimos avanzando los índices una vez más
*/
izquierda++;
derecha--;
}
// El while se repite hasta que izquierda >= derecha
}
}
// Divide y vencerás
private static void quicksort(int arreglo[], int izquierda, int derecha) {
if (izquierda < derecha) {
int indiceParticion = particion(arreglo, izquierda, derecha);
quicksort(arreglo, izquierda, indiceParticion);
quicksort(arreglo, indiceParticion + 1, derecha);
}
}
private static int particion(String arreglo[], int izquierda, int derecha) {
// Elegimos el pivote, es el primero
String pivote = arreglo[izquierda];
// Ciclo infinito
while (true) {
// Mientras cada elemento desde la izquierda esté en orden (sea menor que el
// pivote) continúa avanzando el índice
while (arreglo[izquierda].compareTo(pivote) < 0) {
izquierda++;
}
// Mientras cada elemento desde la derecha esté en orden (sea mayor que el
// pivote) continúa disminuyendo el índice
while (arreglo[derecha].compareTo(pivote) > 0) {
derecha--;
}
/*
Si la izquierda es mayor o igual que la derecha significa que no
necesitamos hacer ningún intercambio
de variables, pues los elementos ya están en orden (al menos en esta
iteración)
*/
if (izquierda >= derecha) {
// Indicar "en dónde nos quedamos" para poder dividir el arreglo de nuevo
// y ordenar los demás elementos
return derecha;
} else {//Nota: yo sé que el else no hace falta por el return de arriba, pero así el algoritmo es más claro
/*
Si las variables quedaron "lejos" (es decir, la izquierda no superó ni
alcanzó a la derecha)
significa que se detuvieron porque encontraron un valor que no estaba
en orden, así que lo intercambiamos
*/
String temporal = arreglo[izquierda];
arreglo[izquierda] = arreglo[derecha];
arreglo[derecha] = temporal;
/*
Ya intercambiamos, pero seguimos avanzando los índices una vez más
*/
izquierda++;
derecha--;
}
// El while se repite hasta que izquierda >= derecha
}
}
// Divide y vencerás
private static void quicksort(String arreglo[], int izquierda, int derecha) {
if (izquierda < derecha) {
int indiceParticion = particion(arreglo, izquierda, derecha);
quicksort(arreglo, izquierda, indiceParticion);
quicksort(arreglo, indiceParticion + 1, derecha);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment