Skip to content

Instantly share code, notes, and snippets.

@parzibyte
Created October 9, 2019 01:44
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/10158b0a2a264072de25cd3042690798 to your computer and use it in GitHub Desktop.
Save parzibyte/10158b0a2a264072de25cd3042690798 to your computer and use it in GitHub Desktop.
int particion(int arreglo[], int izquierda, int derecha) {
// Elegimos el pivote, es el primero
int pivote = arreglo[izquierda];
// Ciclo infinito
while (1) {
// 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
*/
intercambiar(&arreglo[izquierda], &arreglo[derecha]);
/*
Ya intercambiamos, pero seguimos avanzando los índices
*/
izquierda++;
derecha--;
}
// El while se repite hasta que izquierda >= derecha
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment