Practica3 Quicksort
Practica3 Quicksort
PRACTICA 3 – Quicksort
Con ayuda del editor de texto y compilador Visual Code Studio se resolverla las problemáticas
planteada para la práctica 3.
- Pide al usuario que ingrese la cantidad de valores a ordenar (n) y verifica que sea un número
positivo.
- Crea un arreglo dinámico en donde se guardarán los datos a ordenar.
- El programa utiliza un bucle do-while para mantener el menú de opciones hasta que el usuario elija
la opción de salir (opción 4), este do-while tiene dentro un switch para el menú de opciones.
- Antes de ejecutar cada algoritmo, se llena el arreglo generado con los datos correspondientes (datos
ordenados o datos aleatorios desordenados)
Opciones:
1. Ordenar el arreglo generado con cualquier implementación de Quicksort.
2. Ordenar el arreglo generado con el algoritmo Quicksort en donde el pivote es el último elemento.
3. Ordenar el arreglo generado con el algoritmo Quicksort en donde el pivote es un elemento
aleatorio.
4. Salir del programa.
- Cada caso calcula el tiempo de ejecución del algoritmo utilizando clock() antes y después de la
ejecución.
- Se muestra el tiempo de ejecución en segundos para el algoritmo seleccionado.
- Si el usuario selecciona la opción 4, el programa sale del bucle y muestra un mensaje de despedida.
- Las funciones fflush(stdin) se utilizan para limpiar el búfer del teclado después de cada entrada para
evitar problemas de entrada incorrecta.
void quicksort(int arr[], int inicio, int final): Esta función implementa el algoritmo de ordenamiento
quicksort de manera recursiva en un arreglo arr desde el índice inicio hasta el índice final.
int particion(int arr[], int inicio, int final): Esta función se utiliza en el algoritmo quicksort para realizar la
partición del arreglo. Elige un elemento del arreglo (en este caso, el último elemento) como pivote y
reorganiza los elementos del arreglo de manera que todos los elementos menores o iguales al pivote
estén a su izquierda y todos los elementos mayores estén a su derecha. Devuelve la posición final del
pivote después de la partición.
void quicksortRandom(int arr[], int inicio, int final): Esta es una variante de la función quicksort, que
también utiliza el algoritmo quicksort pero con una elección de pivote aleatorio. Esto ayuda a evitar
casos en los que el quicksort tenga un mal rendimiento en arreglos previamente ordenados o
inversamente ordenados. Llama a la función particionRandom para realizar la partición.
int particionRandom(int arr[], int inicio, int final): Esta función elige un elemento aleatorio del arreglo
como pivote y luego llama a la función particion para realizar la partición del arreglo. La elección
aleatoria del pivote mejora el rendimiento en casos específicos.
void intercambiar(int *a, int *b): Esta función se utiliza para intercambiar dos elementos en un arreglo.
Se usa para reorganizar los elementos durante la partición y otras operaciones de ordenamiento.
Archivo “Funciones.h”
Código principal
Resultados
Menú de opciones
Tiempo de ejecución
Cantidad de datos Quicksort pivote al final y Quicksort pivote al final y Quicksort pivote aleatorio
números aleatorios números ordenados y números ordenados
10,000 0.002000 segundos 0.147000 segundos 0.000000 segundos
400,000 2.389000 segundos Se cierra el programa 0.029000 segundos
800,000 9.525000 segundos Se cierra el programa 0.067000 segundos
Conclusión
Al utilizar la opción 1 y 3 con una entrada grande de datos los algoritmos se ejecutan correctamente, el
problema viene cuando se ejecuta la opción 2 con una entrada grande, el programa se cierra después
de un rato de ejecución, esto no pasa con una entrada relativamente pequeña, este resultado me lleva
a pensar que el algoritmo ejecuta demasiadas instrucciones recursivas con una entrada demasiada
grande, lo que genera una saturación en la memoria y provoca que se cierre el programa.