diff --git a/ActGUIVisualizador/.vscode/settings.json b/ActGUIVisualizador/.vscode/settings.json deleted file mode 100644 index ba2a6c0..0000000 --- a/ActGUIVisualizador/.vscode/settings.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "python-envs.defaultEnvManager": "ms-python.python:system", - "python-envs.pythonProjects": [] -} \ No newline at end of file diff --git a/ActGUIVisualizador/AnalisisAlg .pdf b/ActGUIVisualizador/AnalisisAlg .pdf deleted file mode 100644 index bc4d193..0000000 Binary files a/ActGUIVisualizador/AnalisisAlg .pdf and /dev/null differ diff --git a/ActGUIVisualizador/Codigo.py b/ActGUIVisualizador/Codigo.py deleted file mode 100644 index c44e5d0..0000000 --- a/ActGUIVisualizador/Codigo.py +++ /dev/null @@ -1,431 +0,0 @@ -import tkinter as tk -import random -import time -from typing import final -import matplotlib.pyplot as plt -from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg - -# --------------------------- -# Parámetros generales -# --------------------------- -ANCHO = 1200 -ALTO = 350 -N_BARRAS = 30 -VAL_MIN, VAL_MAX = 5, 100 -RETARDO_MS = 40 # velocidad en milisegundos - -# Elementos para la gráfica -TIEMPOS = { - "Selection Sort": {}, - "Bubble Sort": {}, - "Merge Sort": {}, - "Quick Sort": {} -} - - -# --------------------------- -# Algoritmo: Selection Sort -# --------------------------- -def selection_sort_steps(data, draw_callback): - """ - Selection Sort paso a paso. - - data: lista (se modifica in-place) - - draw_callback: función que redibuja el Canvas y puede resaltar índices - """ - n = len(data) - inicio = time.perf_counter() - for i in range(n): - min_idx = i - for j in range(i + 1, n): - draw_callback(activos=[i, j, min_idx]) - yield - if data[j] < data[min_idx]: - min_idx = j - # Intercambio - data[i], data[min_idx] = data[min_idx], data[i] - draw_callback(activos=[i, min_idx]) - yield - draw_callback(activos=[]) - fin = time.perf_counter() - if RETARDO_MS <= 1: - tiempo_ms = (fin - inicio) * 1000 - else: - tiempo_ms = ((fin - inicio) * 1000)/RETARDO_MS - TIEMPOS["Selection Sort"][N_BARRAS] = tiempo_ms - - -def bubble_sort_steps(data, draw_callback): - """Esta función ordenara el vector que le pases como argumento con el Método de Bubble Sort""" - n = 0 # Establecemos un contador del largo del vector - inicio = time.perf_counter() - for _ in data: - n += 1 # Contamos la cantidad de caracteres dentro del vector - - for i in range(n - 1): - # Le damos un rango n para que complete el proceso. - for j in range(0, n - i - 1): - # Revisa la matriz de 0 hasta n-i-1 - draw_callback(activos=[i, j]) - yield - if data[j] > data[j + 1]: - data[j], data[j + 1] = data[j + 1], data[j] - draw_callback(activos=[i, j + 1, j]) - yield - # Se intercambian si el elemento encontrado es mayor - # Luego pasa al siguiente - - # print("El vector ordenado es: ", data) - draw_callback(activos=[]) - yield - fin = time.perf_counter() - if RETARDO_MS <= 1: - tiempo_ms = (fin - inicio) * 1000 - else: - tiempo_ms = ((fin - inicio) * 1000) / RETARDO_MS - TIEMPOS["Bubble Sort"][N_BARRAS] = tiempo_ms - -def merge_sort_steps(data, draw_callback): - inicio = time.perf_counter() - def merge(data): - - def largo(vec): - largovec = 0 # Establecemos un contador del largovec - for _ in vec: - largovec += 1 # Obtenemos el largo del vector - return largovec - - if largo(data) > 1: - medio = largo(data) // 2 # Buscamos el medio del vector - - # Lo dividimos en 2 partes - izq = data[:medio] - der = data[medio:] - - yield from merge(izq) # Mismo procedimiento a la primer mitad - yield from merge(der) # Mismo procedimiento a la segunda mitad - - i = j = k = 0 - - # Copiamos los datos a los vectores temporales izq[] y der[] - while i < largo(izq) and j < largo(der): - draw_callback(activos=[i, j, k]) - yield - if izq[i] < der[j]: - data[k] = izq[i] - draw_callback(activos=[i, k, j]) - yield - i += 1 - else: - data[k] = der[j] - draw_callback(activos=[k, j, i]) - yield - j += 1 - k += 1 - - # Nos fijamos si quedaron elementos en la lista - # tanto derecha como izquierda - while i < largo(izq): - data[k] = izq[i] - draw_callback(activos=[k, i]) - yield - i += 1 - k += 1 - - while j < largo(der): - data[k] = der[j] - draw_callback(activos=[k, j]) - yield - j += 1 - k += 1 - - yield from merge(data) - draw_callback(activos=[]) - yield - - fin = time.perf_counter() - if RETARDO_MS <= 1: - tiempo_ms = (fin - inicio) * 1000 - else: - tiempo_ms = ((fin - inicio) * 1000) / RETARDO_MS - TIEMPOS["Merge Sort"][N_BARRAS] = tiempo_ms - - -def quick_sort_steps(data, draw_callback, start=0, end=None): - """Esta función ordenara el vector que le pases como argumento - con el Método Quick Sort""" - inicio = time.perf_counter() - if end is None: - end = len(data) - 1 - - # Imprimimos la lista obtenida al principio (Desordenada) - # print("El vector a ordenar con quick es:", data) - - def quick(data, start=0, end=len(data) - 1): - - if start >= end: - return - - def particion(data, start=0, end=len(data) - 1): - pivot = data[start] - menor = start + 1 - mayor = end - - while True: - # Si el valor actual es mayor que el pivot - # está en el lugar correcto (lado derecho del pivot) y podemos - # movernos hacia la izquierda, al siguiente elemento. - # También debemos asegurarnos de no haber superado el puntero bajo, ya que indica - # que ya hemos movido todos los elementos a su lado correcto del pivot - - while menor <= mayor and data[mayor] >= pivot: - mayor = mayor - 1 - - # Proceso opuesto al anterior - while menor <= mayor and data[menor] <= pivot: - menor = menor + 1 - - # Encontramos un valor sea mayor o menor y que este fuera del arreglo - # ó menor es más grande que mayor, en cuyo caso salimos del ciclo - if menor <= mayor: - data[menor], data[mayor] = data[mayor], data[menor] - # Continua el bucle - else: - # Salimos del bucle - break - - data[start], data[mayor] = data[mayor], data[start] - - return mayor - - p = particion(data, start, end) - draw_callback(activos=[start, end, p]) - yield - - yield from quick(data, start, p - 1) - yield from quick(data, p + 1, end) - - yield from quick(data, start, end) - draw_callback(activos=[]) - # print("El vector ordenado con quick es:", data) - fin = time.perf_counter() - if RETARDO_MS <= 1: - tiempo_ms = (fin - inicio) * 1000 - else: - tiempo_ms = ((fin - inicio) * 1000) / RETARDO_MS - TIEMPOS["Quick Sort"][N_BARRAS] = tiempo_ms - -# --------------------------- -# Función de dibujo (énfasis) -# --------------------------- -def dibujar_barras(canvas, datos, activos=None): - canvas.delete("all") - if not datos: - return - n = len(datos) - margen = 10 - ancho_disp = ANCHO - 2 * margen - alto_disp = ALTO - 2 * margen - w = ancho_disp / n - esc = alto_disp / max(datos) - - for i, v in enumerate(datos): - x0 = margen + i * w - x1 = x0 + w * 0.9 - h = v * esc - y0 = ALTO - margen - h - y1 = ALTO - margen - - color = "#4e79a7" # azul normal - if activos and i in activos: - color = "#f28e2b" # naranja para comparaciones/intercambios - canvas.create_rectangle(x0, y0, x1, y1, fill=color, outline="") - - canvas.create_text(6, 6, anchor="nw", text=f"n={len(datos)}", fill="#666") - - -# --------------------------- -# Aplicación principal -# --------------------------- -datos = [] -root = tk.Tk() -root.title("Visualizador sencillo - Algoritmos de ordenamiento") - -canvas = tk.Canvas(root, width=ANCHO, height=ALTO, bg="white") -canvas.pack(padx=10, pady=10) - - -def generar(): - """Genera lista de números aleatorios y dibuja.""" - global datos, copiaDatos - random.seed(time.time()) - datos = [random.randint(VAL_MIN, VAL_MAX) for _ in range(N_BARRAS)] - copiaDatos = datos.copy() - dibujar_barras(canvas, datos) - -def cambiar_numero_de_barras(): - global N_BARRAS - valor = entrada.get().strip() - if valor.isdigit() and int(valor) > 0: - N_BARRAS = int(valor) - lblInfo.config(fg="green", text="Barras actualizadas") - else: - lblInfo.config(fg="red", text="Dato inválido") - -def ordenar_selection(): - """Ejecuta la animación del Selection Sort usando un generador + after().""" - if not datos: - return - gen = selection_sort_steps(datos, lambda activos=None: dibujar_barras(canvas, datos, activos)) - - def paso(): - try: - next(gen) # avanza un paso del algoritmo - root.after(RETARDO_MS, paso) # agenda el siguiente paso - except StopIteration: - pass # terminó - - paso() - -def ordenar_bubble(): - if not datos: - return - gen = bubble_sort_steps(datos, lambda activos=None: dibujar_barras(canvas, datos, activos)) - - def paso(): - try: - next(gen) - root.after(RETARDO_MS, paso) - except StopIteration: - pass - - paso() - -def ordenar_merge(): - if not datos: - return - gen = merge_sort_steps(datos, lambda activos=None: dibujar_barras(canvas, datos, activos)) - - def paso(): - try: - next(gen) - root.after(RETARDO_MS, paso) - except StopIteration: - pass - - paso() - -def ordenar_quick(): - if not datos: - return - gen = quick_sort_steps(datos, lambda activos=None: dibujar_barras(canvas, datos, activos), 0, None, ) - - def paso(): - try: - next(gen) - root.after(RETARDO_MS, paso) - except StopIteration: - pass - paso() - -def graficar_tiempos(): - if not any(TIEMPOS.values()): - return - - #Limpiar frame para evitar solapamiento - for widget in frame_graf.winfo_children(): - widget.destroy() - - fig = plt.figure(figsize = (8, 4), dpi=100) - ax = fig.add_subplot(111) - - for i, tiempos in TIEMPOS.items(): - if tiempos: # Solo si hay datos - tam = sorted(tiempos.keys()) - valores = [tiempos[n] for n in tam] - ax.plot(tam, valores, marker="o", label=i) - - ax.set_xlabel("Tamaño de la lista") - ax.set_ylabel("Tiempo promedio (ms)") - ax.set_title("Comparación de algoritmos de ordenamiento") - ax.legend() - ax.grid(True) - - # Incrustar en Tkinter - graf_canvas = FigureCanvasTkAgg(fig, master=frame_graf) - graf_canvas.draw() - graf_canvas.get_tk_widget().pack() - - - -# --------------------------- -# Botones (UI mínima) -# --------------------------- -panel = tk.Frame(root) -panel.pack(pady=6) - -tk.Button(panel, text="Cambiar No. Barras", command=cambiar_numero_de_barras).pack(side="left", padx=5) -entrada = tk.Entry(panel, bg="light goldenrod") -entrada.pack(padx=5, side="left") -lblInfo = tk.Label(panel, text="") -lblInfo.pack(padx=5, side="left") - -tk.Button(panel, text="Generar", command=generar).pack(side="left", padx=5) - -# Dropdown para seleccionar algoritmo -algoritmos = { - "Selection Sort": ordenar_selection, - "Bubble Sort": ordenar_bubble, - "Merge Sort": ordenar_merge, - "Quick Sort": ordenar_quick -} - -algoritmo_var = tk.StringVar(value="Selection Sort") -tk.Label(panel, text="Algoritmo:").pack(side="left", padx=5) -tk.OptionMenu(panel, algoritmo_var, *algoritmos.keys()).pack(side="left", padx=5) - - -# Botón único para ordenar -def ordenar(): - func = algoritmos.get(algoritmo_var.get()) - if func: - func() - - -tk.Button(panel, text="Ordenar", command=ordenar).pack(side="left", padx=5) - - -def limpiarRes(): - global datos - datos = copiaDatos.copy() - dibujar_barras(canvas, datos) - - -tk.Button(panel, text="Limpiar Resultado", command=limpiarRes).pack(side="left", padx=5) -tk.Button(panel, text="Graficar Tiempos", command=graficar_tiempos).pack(side="left", padx=5) - -def mezclar(): - """Mezcla la lista de números aleatorios y dibuja.""" - global datos, copiaDatos - random.shuffle(datos) - copiaDatos = datos.copy() - dibujar_barras(canvas, datos) - - -tk.Button(panel, text="Mezclar", command=mezclar).pack(side="left", padx=5) - -tk.Scale(panel, from_=0, to=200, label="Velocidad (ms)", orient="horizontal", - variable=tk.IntVar(value=RETARDO_MS), - command=lambda v: globals().update(RETARDO_MS=int(v)) - ).pack(side="left", padx=5) - -#Gráfica - -frame_graf = tk.Frame(root) -frame_graf.pack(pady=3) - -# --------------------------- -# Estado inicial -# --------------------------- -#generar() # crea y dibuja datos al abrir - -root.mainloop() # inicia la app \ No newline at end of file diff --git a/ActGUIVisualizador/gif.zip b/ActGUIVisualizador/gif.zip deleted file mode 100644 index e65fa61..0000000 Binary files a/ActGUIVisualizador/gif.zip and /dev/null differ diff --git a/ActGUIVisualizador/requirements.txt b/ActGUIVisualizador/requirements.txt deleted file mode 100644 index ce88283..0000000 Binary files a/ActGUIVisualizador/requirements.txt and /dev/null differ diff --git a/ActGUIVisualizador/tabla.jpg b/ActGUIVisualizador/tabla.jpg deleted file mode 100644 index 1c5dd06..0000000 Binary files a/ActGUIVisualizador/tabla.jpg and /dev/null differ diff --git a/Captura de pantalla 2025-10-01 075604.png b/Captura de pantalla 2025-10-01 075604.png new file mode 100644 index 0000000..401efcd Binary files /dev/null and b/Captura de pantalla 2025-10-01 075604.png differ diff --git a/Captura de pantalla 2025-10-01 075728.png b/Captura de pantalla 2025-10-01 075728.png new file mode 100644 index 0000000..52990eb Binary files /dev/null and b/Captura de pantalla 2025-10-01 075728.png differ diff --git a/ComplejidadTemporal/Screenshot (404).png b/ComplejidadTemporal/Screenshot (404).png deleted file mode 100644 index e27ad70..0000000 Binary files a/ComplejidadTemporal/Screenshot (404).png and /dev/null differ diff --git a/ComplejidadTemporal/main.zip b/ComplejidadTemporal/main.zip deleted file mode 100644 index c297dba..0000000 Binary files a/ComplejidadTemporal/main.zip and /dev/null differ diff --git a/Il355_P1_DagninoGerardo/.vscode/launch.json b/Il355_P1_DagninoGerardo/.vscode/launch.json deleted file mode 100644 index 6b76b4f..0000000 --- a/Il355_P1_DagninoGerardo/.vscode/launch.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "Python Debugger: Current File", - "type": "debugpy", - "request": "launch", - "program": "${file}", - "console": "integratedTerminal" - } - ] -} \ No newline at end of file diff --git a/Il355_P1_DagninoGerardo/IL355_P1_DagninoGerardo.pdf b/Il355_P1_DagninoGerardo/IL355_P1_DagninoGerardo.pdf deleted file mode 100644 index 5413c31..0000000 Binary files a/Il355_P1_DagninoGerardo/IL355_P1_DagninoGerardo.pdf and /dev/null differ diff --git a/Il355_P1_DagninoGerardo/README.md b/Il355_P1_DagninoGerardo/README.md deleted file mode 100644 index 7339a1b..0000000 --- a/Il355_P1_DagninoGerardo/README.md +++ /dev/null @@ -1,3 +0,0 @@ -Este programa se hizo en Visual Studio Code -Para ejecutar primero será necesario tener las extensiones de Python, Python Debugger y Python Enviornments de Microsoft -Dentro de Visual Studio Code, establece el interpretador, yo usé el default que viene con las extensiones y ejecuta. diff --git a/Il355_P1_DagninoGerardo/Screenshot (395).png b/Il355_P1_DagninoGerardo/Screenshot (395).png deleted file mode 100644 index f68776f..0000000 Binary files a/Il355_P1_DagninoGerardo/Screenshot (395).png and /dev/null differ diff --git a/Il355_P1_DagninoGerardo/Screenshot (396).png b/Il355_P1_DagninoGerardo/Screenshot (396).png deleted file mode 100644 index 1752514..0000000 Binary files a/Il355_P1_DagninoGerardo/Screenshot (396).png and /dev/null differ diff --git a/Il355_P1_DagninoGerardo/Screenshot (397).png b/Il355_P1_DagninoGerardo/Screenshot (397).png deleted file mode 100644 index fcfdcbf..0000000 Binary files a/Il355_P1_DagninoGerardo/Screenshot (397).png and /dev/null differ diff --git a/Il355_P1_DagninoGerardo/main.py b/Il355_P1_DagninoGerardo/main.py deleted file mode 100644 index 8c1d00f..0000000 --- a/Il355_P1_DagninoGerardo/main.py +++ /dev/null @@ -1,215 +0,0 @@ -import tkinter as tk -from tkinter import messagebox -import matplotlib.pyplot as plt -from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg -import random as rd -import time - -array = [] -# Tiempos y pruebas para búsqueda lineal -avarageTimeL = [0, 0, 0, 0] -numberOfTriesL = [0, 0, 0, 0] -# Tiempos y pruebas para búsqueda binaria -avarageTimeB = [0, 0, 0, 0] -numberOfTriesB = [0, 0, 0, 0] - -def generateRandInt(): - return rd.randint(0, 100000) - -def generateArray(n): - global array - array = [generateRandInt() for _ in range(n)] - lbl.config(text=f"Array Size: {len(array)}") - array.sort() - print(array, "Array generado y ordenado", len(array), "elementos") - -def arraySize(): - if radioVar.get() == 1: - return 100 - elif radioVar.get() == 2: - return 1000 - elif radioVar.get() == 3: - return 10000 - elif radioVar.get() == 4: - return 100000 - else: - return 0 - -def linealSearch(arr, target): - start = time.perf_counter() - index = -1 - for i in range(len(arr)): - if arr[i] == target: - index = i - break - end = time.perf_counter() - elapsed_time = end - start - - idx = radioVar.get() - 1 - - if index == -1: - messagebox.showwarning("Advertencia", f"No se encontro el numero:{target}") - else: - messagebox.showinfo("Resultado", f"Numero encontrado en el indice: {index}") - lblE.config(text=f"Entrada (Numero a buscar): \nNumero encontrado en el indice: {index}") - numberOfTriesL[idx] += 1 - avarageTimeL[idx] += elapsed_time / numberOfTriesL[idx] - updateResults() - actualizarGrafica() - -def binarySearch(arr, target): - index = -1 - left = 0 - right = len(arr) - 1 - start = time.perf_counter() - while left <= right: - mid = (left + right) // 2 - if arr[mid] == target: - index = mid - break - elif arr[mid] < target: - left = mid + 1 - else: - right = mid - 1 - end = time.perf_counter() - elapsed_time = end - start - - idx = radioVar.get() - 1 - - - if index == -1: - messagebox.showwarning("Advertencia", f"No se encontro el numero:{target}") - else: - messagebox.showinfo("Resultado", f"Numero encontrado en el indice: {index}") - lblE.config(text=f"Entrada (Numero a buscar): \nNumero encontrado en el indice: {index}") - numberOfTriesB[idx] += 1 - avarageTimeB[idx] += elapsed_time / numberOfTriesB[idx] - updateResults() - actualizarGrafica() - -def getInt(): - try: - num = int(entrada.get()) - if num < 0: - messagebox.showerror("Error", "Por favor ingresa un número entero positivo.") - return None - except ValueError: - messagebox.showerror("Error", "Por favor ingresa un número entero positivo.") - return None - return num - -def updateResults(): - # Lineal - lblR100L.config(text=f"100: {avarageTimeL[0]*1000:.3f} ms, {numberOfTriesL[0]} pruebas") - lblR1000L.config(text=f"1,000: {avarageTimeL[1]*1000:.3f} ms, {numberOfTriesL[1]} pruebas") - lblR10000L.config(text=f"10,000: {avarageTimeL[2]*1000:.3f} ms, {numberOfTriesL[2]} pruebas") - lblR100000L.config(text=f"100,000: {avarageTimeL[3]*1000:.3f} ms, {numberOfTriesL[3]} pruebas") - # Binaria - lblR100B.config(text=f"100: {avarageTimeB[0]*1000:.3f} ms, {numberOfTriesB[0]} pruebas") - lblR1000B.config(text=f"1,000: {avarageTimeB[1]*1000:.3f} ms, {numberOfTriesB[1]} pruebas") - lblR10000B.config(text=f"10,000: {avarageTimeB[2]*1000:.3f} ms, {numberOfTriesB[2]} pruebas") - lblR100000B.config(text=f"100,000: {avarageTimeB[3]*1000:.3f} ms, {numberOfTriesB[3]} pruebas") - -def actualizarGrafica(): - ax.clear() - x = ["100", "1000", "10000", "100000"] - # Multiplica los tiempos por 1000 para mostrar en ms - ax.bar([i - 0.2 for i in range(4)], [t*1000 for t in avarageTimeL], width=0.4, label="Lineal", color='blue') - ax.bar([i + 0.2 for i in range(4)], [t*1000 for t in avarageTimeB], width=0.4, label="Binaria", color='orange') - ax.set_xticks(range(4)) - ax.set_xticklabels(x) - ax.set_xlabel('Tamaño del Array') - ax.set_ylabel('Tiempo Promedio (ms)') - ax.set_title('Tiempo Promedio de Búsqueda') - ax.legend() - canvas.draw() - -def checkEntry(*args): - if entrada.get().isdigit(): - btnBL.config(state=tk.NORMAL) - btnBB.config(state=tk.NORMAL) - else: - btnBL.config(state=tk.DISABLED) - btnBB.config(state=tk.DISABLED) - -root = tk.Tk() -root.title("Practica 1 - Busqueda") -root.geometry("900x700") - -frameTop = tk.Frame(root) -frameTop.pack(side=tk.TOP, fill=tk.X) - -fig, ax = plt.subplots(figsize=(7, 4)) -ax.bar(["100", "1,000", "10,000", "100,000"], avarageTimeL, color='blue', label="Lineal") -ax.bar(["100", "1,000", "10,000", "100,000"], avarageTimeB, color='orange', label="Binaria") -ax.set_xlabel('Tamaño del Array') -ax.set_ylabel('Tiempo Promedio (s)') -ax.set_title('Tiempo Promedio de Búsqueda') -ax.legend() - -canvas = FigureCanvasTkAgg(fig, master=frameTop) -canvas.draw() -canvas.get_tk_widget().pack(side=tk.TOP, fill=tk.BOTH, expand=True) - -frameBottom = tk.Frame(root) -frameBottom.pack(side=tk.BOTTOM, fill=tk.X) - -for i in range(5): - frameBottom.grid_columnconfigure(i, minsize=50) - frameBottom.grid_rowconfigure(i, minsize=50) - -radioVar = tk.IntVar() -radioVar.set(1) -rb1 = tk.Radiobutton(frameBottom, text="100", variable=radioVar, value=1) -rb1.grid(row=0, column=1) -rb2 = tk.Radiobutton(frameBottom, text="1,000", variable=radioVar, value=2) -rb2.grid(row=1, column=1) -rb3 = tk.Radiobutton(frameBottom, text="10,000", variable=radioVar, value=3) -rb3.grid(row=2, column=1) -rb4 = tk.Radiobutton(frameBottom, text="100,000", variable=radioVar, value=4) -rb4.grid(row=3, column=1) - -lbl = tk.Label(frameBottom, text="Array Size: ") -lbl.grid(row=0, column=2, padx=10, pady=10) - -btn = tk.Button(frameBottom, text="Generar lista", command= lambda: generateArray(arraySize())) -btn.grid(row=1, column=2, padx=10, pady=10) - -lblE = tk.Label(frameBottom, text="Entrada (Numero a buscar): ") -lblE.grid(row=0, column=3, padx=10, pady=10) - -entrada = tk.Entry(frameBottom) -entrada.grid(row=1, column=3, padx=10, pady=10) -entrada.bind("", checkEntry) - -btnBL = tk.Button(frameBottom, text="Busqueda Lineal", command=lambda: linealSearch(array, getInt()), state=tk.DISABLED) -btnBL.grid(row=2, column=3, padx=10, pady=10) - -btnBB = tk.Button(frameBottom, text="Busqueda Binaria", command=lambda: binarySearch(array, getInt()), state=tk.DISABLED) -btnBB.grid(row=3, column=3, padx=10, pady=10) - -# Labels para resultados de búsqueda lineal -lblZR_L = tk.Label(frameBottom, text="Resultados Lineal\n(Tiempo promedio)") -lblZR_L.grid(row=0, column=4, padx=10, pady=10) -lblR100L = tk.Label(frameBottom, text=f"100: {avarageTimeL[0]*1000:.3f} s, {numberOfTriesL[0]} pruebas") -lblR100L.grid(row=1, column=4, padx=10, pady=10) -lblR1000L = tk.Label(frameBottom, text=f"1,000: {avarageTimeL[1]*1000:.3f} s, {numberOfTriesL[1]} pruebas") -lblR1000L.grid(row=2, column=4, padx=10, pady=10) -lblR10000L = tk.Label(frameBottom, text=f"10,000: {avarageTimeL[2]*1000:.3f} s, {numberOfTriesL[2]} pruebas") -lblR10000L.grid(row=3, column=4, padx=10, pady=10) -lblR100000L = tk.Label(frameBottom, text=f"100,000: {avarageTimeL[3]*1000:.3f} s, {numberOfTriesL[3]} pruebas") -lblR100000L.grid(row=4, column=4, padx=10, pady=10) - -# Labels para resultados de búsqueda binaria -lblZR_B = tk.Label(frameBottom, text="Resultados Binaria\n(Tiempo promedio)") -lblZR_B.grid(row=0, column=5, padx=10, pady=10) -lblR100B = tk.Label(frameBottom, text=f"100: {avarageTimeB[0]*1000:.3f} s, {numberOfTriesB[0]} pruebas") -lblR100B.grid(row=1, column=5, padx=10, pady=10) -lblR1000B = tk.Label(frameBottom, text=f"1,000: {avarageTimeB[1]*1000:.3f} s, {numberOfTriesB[1]} pruebas") -lblR1000B.grid(row=2, column=5, padx=10, pady=10) -lblR10000B = tk.Label(frameBottom, text=f"10,000: {avarageTimeB[2]*1000:.3f} s, {numberOfTriesB[2]} pruebas") -lblR10000B.grid(row=3, column=5, padx=10, pady=10) -lblR100000B = tk.Label(frameBottom, text=f"100,000: {avarageTimeB[3]*1000:.3f} s, {numberOfTriesB[3]} pruebas") -lblR100000B.grid(row=4, column=5, padx=10, pady=10) - -root.mainloop() \ No newline at end of file diff --git a/Il355_P1_DagninoGerardo/requierements.txt b/Il355_P1_DagninoGerardo/requierements.txt deleted file mode 100644 index 305f29f..0000000 Binary files a/Il355_P1_DagninoGerardo/requierements.txt and /dev/null differ diff --git a/Pract05FuerzaBruta/.vscode/settings.json b/Pract05FuerzaBruta/.vscode/settings.json deleted file mode 100644 index ba2a6c0..0000000 --- a/Pract05FuerzaBruta/.vscode/settings.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "python-envs.defaultEnvManager": "ms-python.python:system", - "python-envs.pythonProjects": [] -} \ No newline at end of file diff --git a/Pract05FuerzaBruta/funcion.py b/Pract05FuerzaBruta/funcion.py deleted file mode 100644 index 371d838..0000000 --- a/Pract05FuerzaBruta/funcion.py +++ /dev/null @@ -1,114 +0,0 @@ -import math -import tkinter as tk - -import random - -def fun(p1, p2): - x=p2[0]-p1[0] - y=p2[1]-p1[1] - x=pow(x,2) - y = pow(y, 2) - return math.sqrt(x+y) - -def calcular(): - p1 = (float(p1x.get()), float(p1y.get())) - p2 = (float(p2x.get()), float(p2y.get())) - p3 = (float(p3x.get()), float(p3y.get())) - p4 = (float(p4x.get()), float(p4y.get())) - p5 = (float(p5x.get()), float(p5y.get())) - puntos = (p1, p2, p3, p4, p5) - - menor = None - for i in range(5): - for j in range(5): - if i != j: - resultado = fun(puntos[i], puntos[j]) - if menor is None or resultado < menor: - menor = resultado - PA = puntos[i] - PB = puntos[j] - - if menor is not None: - res.config(text=f"El resultado es: {menor:.4f}, en los puntos {PA} y {PB}") - else: - res.config(text="El resultado es: N/A") - return menor - -def limpiar(): - for entry in [p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y, p5x, p5y]: - entry.delete(0, tk.END) - res.config(text="El resultado es: ") - -def llenar_random(): - for entry in [p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y, p5x, p5y]: - entry.delete(0, tk.END) - entry.insert(0, str(random.randint(0, 10))) - -root = tk.Tk() -root.title("Formula Euclidiana Clase") -root.geometry("360x250") - -# P1 -frame_p1 = tk.Frame(root) -frame_p1.pack(pady=5) -p1 = tk.Label(frame_p1, text="P1") -p1.pack(side=tk.LEFT, padx=5) -p1x = tk.Entry(frame_p1, width=7) -p1x.pack(side=tk.LEFT, padx=2) -p1y = tk.Entry(frame_p1, width=7) -p1y.pack(side=tk.LEFT, padx=2) - -# P2 -frame_p2 = tk.Frame(root) -frame_p2.pack(pady=5) -p2 = tk.Label(frame_p2, text="P2") -p2.pack(side=tk.LEFT, padx=5) -p2x = tk.Entry(frame_p2, width=7) -p2x.pack(side=tk.LEFT, padx=2) -p2y = tk.Entry(frame_p2, width=7) -p2y.pack(side=tk.LEFT, padx=2) - -# P3 -frame_p3 = tk.Frame(root) -frame_p3.pack(pady=5) -p3 = tk.Label(frame_p3, text="P3") -p3.pack(side=tk.LEFT, padx=5) -p3x = tk.Entry(frame_p3, width=7) -p3x.pack(side=tk.LEFT, padx=2) -p3y = tk.Entry(frame_p3, width=7) -p3y.pack(side=tk.LEFT, padx=2) - -# P4 -frame_p4 = tk.Frame(root) -frame_p4.pack(pady=5) -p4 = tk.Label(frame_p4, text="P4") -p4.pack(side=tk.LEFT, padx=5) -p4x = tk.Entry(frame_p4, width=7) -p4x.pack(side=tk.LEFT, padx=2) -p4y = tk.Entry(frame_p4, width=7) -p4y.pack(side=tk.LEFT, padx=2) - -# P5 -frame_p5 = tk.Frame(root) -frame_p5.pack(pady=5) -p5 = tk.Label(frame_p5, text="P5") -p5.pack(side=tk.LEFT, padx=5) -p5x = tk.Entry(frame_p5, width=7) -p5x.pack(side=tk.LEFT, padx=2) -p5y = tk.Entry(frame_p5, width=7) -p5y.pack(side=tk.LEFT, padx=2) - - -# Frame para los botones -frame_botones = tk.Frame(root) -frame_botones.pack(pady=5) -tk.Button(frame_botones, text="Calcular", command=calcular).pack(side=tk.LEFT, padx=5) -tk.Button(frame_botones, text="Llenar Random", command=llenar_random).pack(side=tk.LEFT, padx=5) -tk.Button(frame_botones, text="Limpiar", command=limpiar).pack(side=tk.LEFT, padx=5) - -res = tk.Label(root, text="El resultado es: ") -res.pack(pady=5) - - - -root.mainloop() \ No newline at end of file diff --git a/Pract05FuerzaBruta/requirements.txt b/Pract05FuerzaBruta/requirements.txt deleted file mode 100644 index b90376f..0000000 Binary files a/Pract05FuerzaBruta/requirements.txt and /dev/null differ diff --git a/merge.py b/merge.py new file mode 100644 index 0000000..0156082 --- /dev/null +++ b/merge.py @@ -0,0 +1,72 @@ +import tkinter as tk +import random +import time + +LISTA = [] +VAL_MIN = 1 +VAL_MAX = 10000 +TAMLISTA = 0 + +def merge_sort(lista): + if len(lista) <= 1: + return lista + medio = len(lista) // 2 + izquierda = lista[:medio] + derecha = lista[medio:] + izquierda = merge_sort(izquierda) + derecha = merge_sort(derecha) + return merge(izquierda, derecha) + +def merge(izquierda, derecha): + resultado = [] + i, j = 0, 0 + while i < len(izquierda) and j < len(derecha): + if izquierda[i] < derecha[j]: + resultado.append(izquierda[i]) + i += 1 + else: + resultado.append(derecha[j]) + j += 1 + resultado += izquierda[i:] + resultado += derecha[j:] + return resultado + +def generar(): + global LISTA, TAMLISTA + try: + TAMLISTA = int(entrada.get()) + except ValueError: + TAMLISTA = 10 # valor por defecto + random.seed(time.time()) + LISTA = [random.randint(VAL_MIN, VAL_MAX) for _ in range(TAMLISTA)] + lblInfo.config(text=f"Lista creada con {TAMLISTA} elementos") + txtSalida.delete("1.0", tk.END) + txtSalida.insert(tk.END, f"Lista generada:\n{LISTA}\n") + +def ordenar(): + global LISTA + LISTA = merge_sort(LISTA) + lblInfo.config(text="Lista ordenada con MergeSort") + txtSalida.insert(tk.END, f"\nLista ordenada:\n{LISTA}\n") + +# GUI +root = tk.Tk() +root.title("Visualizador sencillo - MergeSort") + +panel = tk.Frame(root) +panel.pack(pady=6) + +tk.Label(panel, text="Tamaño de la lista").pack(padx=5, side="left") +entrada = tk.Entry(panel, bg="light goldenrod") +entrada.pack(padx=5, side="left") +lblInfo = tk.Label(panel, text="") +lblInfo.pack(padx=5, side="left") + +tk.Button(panel, text="Crear lista", command=generar).pack(side="left", padx=5) +tk.Button(panel, text="Ordenar (MergeSort)", command=ordenar).pack(side="left", padx=5) + +# Cuadro de salida de texto +txtSalida = tk.Text(root, width=120, height=20, bg="white") +txtSalida.pack(padx=10, pady=10) + +root.mainloop() \ No newline at end of file diff --git a/participacionGUIVisualizador/.vscode/settings.json b/participacionGUIVisualizador/.vscode/settings.json deleted file mode 100644 index ba2a6c0..0000000 --- a/participacionGUIVisualizador/.vscode/settings.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "python-envs.defaultEnvManager": "ms-python.python:system", - "python-envs.pythonProjects": [] -} \ No newline at end of file diff --git a/participacionGUIVisualizador/Codigo.py b/participacionGUIVisualizador/Codigo.py deleted file mode 100644 index c44e5d0..0000000 --- a/participacionGUIVisualizador/Codigo.py +++ /dev/null @@ -1,431 +0,0 @@ -import tkinter as tk -import random -import time -from typing import final -import matplotlib.pyplot as plt -from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg - -# --------------------------- -# Parámetros generales -# --------------------------- -ANCHO = 1200 -ALTO = 350 -N_BARRAS = 30 -VAL_MIN, VAL_MAX = 5, 100 -RETARDO_MS = 40 # velocidad en milisegundos - -# Elementos para la gráfica -TIEMPOS = { - "Selection Sort": {}, - "Bubble Sort": {}, - "Merge Sort": {}, - "Quick Sort": {} -} - - -# --------------------------- -# Algoritmo: Selection Sort -# --------------------------- -def selection_sort_steps(data, draw_callback): - """ - Selection Sort paso a paso. - - data: lista (se modifica in-place) - - draw_callback: función que redibuja el Canvas y puede resaltar índices - """ - n = len(data) - inicio = time.perf_counter() - for i in range(n): - min_idx = i - for j in range(i + 1, n): - draw_callback(activos=[i, j, min_idx]) - yield - if data[j] < data[min_idx]: - min_idx = j - # Intercambio - data[i], data[min_idx] = data[min_idx], data[i] - draw_callback(activos=[i, min_idx]) - yield - draw_callback(activos=[]) - fin = time.perf_counter() - if RETARDO_MS <= 1: - tiempo_ms = (fin - inicio) * 1000 - else: - tiempo_ms = ((fin - inicio) * 1000)/RETARDO_MS - TIEMPOS["Selection Sort"][N_BARRAS] = tiempo_ms - - -def bubble_sort_steps(data, draw_callback): - """Esta función ordenara el vector que le pases como argumento con el Método de Bubble Sort""" - n = 0 # Establecemos un contador del largo del vector - inicio = time.perf_counter() - for _ in data: - n += 1 # Contamos la cantidad de caracteres dentro del vector - - for i in range(n - 1): - # Le damos un rango n para que complete el proceso. - for j in range(0, n - i - 1): - # Revisa la matriz de 0 hasta n-i-1 - draw_callback(activos=[i, j]) - yield - if data[j] > data[j + 1]: - data[j], data[j + 1] = data[j + 1], data[j] - draw_callback(activos=[i, j + 1, j]) - yield - # Se intercambian si el elemento encontrado es mayor - # Luego pasa al siguiente - - # print("El vector ordenado es: ", data) - draw_callback(activos=[]) - yield - fin = time.perf_counter() - if RETARDO_MS <= 1: - tiempo_ms = (fin - inicio) * 1000 - else: - tiempo_ms = ((fin - inicio) * 1000) / RETARDO_MS - TIEMPOS["Bubble Sort"][N_BARRAS] = tiempo_ms - -def merge_sort_steps(data, draw_callback): - inicio = time.perf_counter() - def merge(data): - - def largo(vec): - largovec = 0 # Establecemos un contador del largovec - for _ in vec: - largovec += 1 # Obtenemos el largo del vector - return largovec - - if largo(data) > 1: - medio = largo(data) // 2 # Buscamos el medio del vector - - # Lo dividimos en 2 partes - izq = data[:medio] - der = data[medio:] - - yield from merge(izq) # Mismo procedimiento a la primer mitad - yield from merge(der) # Mismo procedimiento a la segunda mitad - - i = j = k = 0 - - # Copiamos los datos a los vectores temporales izq[] y der[] - while i < largo(izq) and j < largo(der): - draw_callback(activos=[i, j, k]) - yield - if izq[i] < der[j]: - data[k] = izq[i] - draw_callback(activos=[i, k, j]) - yield - i += 1 - else: - data[k] = der[j] - draw_callback(activos=[k, j, i]) - yield - j += 1 - k += 1 - - # Nos fijamos si quedaron elementos en la lista - # tanto derecha como izquierda - while i < largo(izq): - data[k] = izq[i] - draw_callback(activos=[k, i]) - yield - i += 1 - k += 1 - - while j < largo(der): - data[k] = der[j] - draw_callback(activos=[k, j]) - yield - j += 1 - k += 1 - - yield from merge(data) - draw_callback(activos=[]) - yield - - fin = time.perf_counter() - if RETARDO_MS <= 1: - tiempo_ms = (fin - inicio) * 1000 - else: - tiempo_ms = ((fin - inicio) * 1000) / RETARDO_MS - TIEMPOS["Merge Sort"][N_BARRAS] = tiempo_ms - - -def quick_sort_steps(data, draw_callback, start=0, end=None): - """Esta función ordenara el vector que le pases como argumento - con el Método Quick Sort""" - inicio = time.perf_counter() - if end is None: - end = len(data) - 1 - - # Imprimimos la lista obtenida al principio (Desordenada) - # print("El vector a ordenar con quick es:", data) - - def quick(data, start=0, end=len(data) - 1): - - if start >= end: - return - - def particion(data, start=0, end=len(data) - 1): - pivot = data[start] - menor = start + 1 - mayor = end - - while True: - # Si el valor actual es mayor que el pivot - # está en el lugar correcto (lado derecho del pivot) y podemos - # movernos hacia la izquierda, al siguiente elemento. - # También debemos asegurarnos de no haber superado el puntero bajo, ya que indica - # que ya hemos movido todos los elementos a su lado correcto del pivot - - while menor <= mayor and data[mayor] >= pivot: - mayor = mayor - 1 - - # Proceso opuesto al anterior - while menor <= mayor and data[menor] <= pivot: - menor = menor + 1 - - # Encontramos un valor sea mayor o menor y que este fuera del arreglo - # ó menor es más grande que mayor, en cuyo caso salimos del ciclo - if menor <= mayor: - data[menor], data[mayor] = data[mayor], data[menor] - # Continua el bucle - else: - # Salimos del bucle - break - - data[start], data[mayor] = data[mayor], data[start] - - return mayor - - p = particion(data, start, end) - draw_callback(activos=[start, end, p]) - yield - - yield from quick(data, start, p - 1) - yield from quick(data, p + 1, end) - - yield from quick(data, start, end) - draw_callback(activos=[]) - # print("El vector ordenado con quick es:", data) - fin = time.perf_counter() - if RETARDO_MS <= 1: - tiempo_ms = (fin - inicio) * 1000 - else: - tiempo_ms = ((fin - inicio) * 1000) / RETARDO_MS - TIEMPOS["Quick Sort"][N_BARRAS] = tiempo_ms - -# --------------------------- -# Función de dibujo (énfasis) -# --------------------------- -def dibujar_barras(canvas, datos, activos=None): - canvas.delete("all") - if not datos: - return - n = len(datos) - margen = 10 - ancho_disp = ANCHO - 2 * margen - alto_disp = ALTO - 2 * margen - w = ancho_disp / n - esc = alto_disp / max(datos) - - for i, v in enumerate(datos): - x0 = margen + i * w - x1 = x0 + w * 0.9 - h = v * esc - y0 = ALTO - margen - h - y1 = ALTO - margen - - color = "#4e79a7" # azul normal - if activos and i in activos: - color = "#f28e2b" # naranja para comparaciones/intercambios - canvas.create_rectangle(x0, y0, x1, y1, fill=color, outline="") - - canvas.create_text(6, 6, anchor="nw", text=f"n={len(datos)}", fill="#666") - - -# --------------------------- -# Aplicación principal -# --------------------------- -datos = [] -root = tk.Tk() -root.title("Visualizador sencillo - Algoritmos de ordenamiento") - -canvas = tk.Canvas(root, width=ANCHO, height=ALTO, bg="white") -canvas.pack(padx=10, pady=10) - - -def generar(): - """Genera lista de números aleatorios y dibuja.""" - global datos, copiaDatos - random.seed(time.time()) - datos = [random.randint(VAL_MIN, VAL_MAX) for _ in range(N_BARRAS)] - copiaDatos = datos.copy() - dibujar_barras(canvas, datos) - -def cambiar_numero_de_barras(): - global N_BARRAS - valor = entrada.get().strip() - if valor.isdigit() and int(valor) > 0: - N_BARRAS = int(valor) - lblInfo.config(fg="green", text="Barras actualizadas") - else: - lblInfo.config(fg="red", text="Dato inválido") - -def ordenar_selection(): - """Ejecuta la animación del Selection Sort usando un generador + after().""" - if not datos: - return - gen = selection_sort_steps(datos, lambda activos=None: dibujar_barras(canvas, datos, activos)) - - def paso(): - try: - next(gen) # avanza un paso del algoritmo - root.after(RETARDO_MS, paso) # agenda el siguiente paso - except StopIteration: - pass # terminó - - paso() - -def ordenar_bubble(): - if not datos: - return - gen = bubble_sort_steps(datos, lambda activos=None: dibujar_barras(canvas, datos, activos)) - - def paso(): - try: - next(gen) - root.after(RETARDO_MS, paso) - except StopIteration: - pass - - paso() - -def ordenar_merge(): - if not datos: - return - gen = merge_sort_steps(datos, lambda activos=None: dibujar_barras(canvas, datos, activos)) - - def paso(): - try: - next(gen) - root.after(RETARDO_MS, paso) - except StopIteration: - pass - - paso() - -def ordenar_quick(): - if not datos: - return - gen = quick_sort_steps(datos, lambda activos=None: dibujar_barras(canvas, datos, activos), 0, None, ) - - def paso(): - try: - next(gen) - root.after(RETARDO_MS, paso) - except StopIteration: - pass - paso() - -def graficar_tiempos(): - if not any(TIEMPOS.values()): - return - - #Limpiar frame para evitar solapamiento - for widget in frame_graf.winfo_children(): - widget.destroy() - - fig = plt.figure(figsize = (8, 4), dpi=100) - ax = fig.add_subplot(111) - - for i, tiempos in TIEMPOS.items(): - if tiempos: # Solo si hay datos - tam = sorted(tiempos.keys()) - valores = [tiempos[n] for n in tam] - ax.plot(tam, valores, marker="o", label=i) - - ax.set_xlabel("Tamaño de la lista") - ax.set_ylabel("Tiempo promedio (ms)") - ax.set_title("Comparación de algoritmos de ordenamiento") - ax.legend() - ax.grid(True) - - # Incrustar en Tkinter - graf_canvas = FigureCanvasTkAgg(fig, master=frame_graf) - graf_canvas.draw() - graf_canvas.get_tk_widget().pack() - - - -# --------------------------- -# Botones (UI mínima) -# --------------------------- -panel = tk.Frame(root) -panel.pack(pady=6) - -tk.Button(panel, text="Cambiar No. Barras", command=cambiar_numero_de_barras).pack(side="left", padx=5) -entrada = tk.Entry(panel, bg="light goldenrod") -entrada.pack(padx=5, side="left") -lblInfo = tk.Label(panel, text="") -lblInfo.pack(padx=5, side="left") - -tk.Button(panel, text="Generar", command=generar).pack(side="left", padx=5) - -# Dropdown para seleccionar algoritmo -algoritmos = { - "Selection Sort": ordenar_selection, - "Bubble Sort": ordenar_bubble, - "Merge Sort": ordenar_merge, - "Quick Sort": ordenar_quick -} - -algoritmo_var = tk.StringVar(value="Selection Sort") -tk.Label(panel, text="Algoritmo:").pack(side="left", padx=5) -tk.OptionMenu(panel, algoritmo_var, *algoritmos.keys()).pack(side="left", padx=5) - - -# Botón único para ordenar -def ordenar(): - func = algoritmos.get(algoritmo_var.get()) - if func: - func() - - -tk.Button(panel, text="Ordenar", command=ordenar).pack(side="left", padx=5) - - -def limpiarRes(): - global datos - datos = copiaDatos.copy() - dibujar_barras(canvas, datos) - - -tk.Button(panel, text="Limpiar Resultado", command=limpiarRes).pack(side="left", padx=5) -tk.Button(panel, text="Graficar Tiempos", command=graficar_tiempos).pack(side="left", padx=5) - -def mezclar(): - """Mezcla la lista de números aleatorios y dibuja.""" - global datos, copiaDatos - random.shuffle(datos) - copiaDatos = datos.copy() - dibujar_barras(canvas, datos) - - -tk.Button(panel, text="Mezclar", command=mezclar).pack(side="left", padx=5) - -tk.Scale(panel, from_=0, to=200, label="Velocidad (ms)", orient="horizontal", - variable=tk.IntVar(value=RETARDO_MS), - command=lambda v: globals().update(RETARDO_MS=int(v)) - ).pack(side="left", padx=5) - -#Gráfica - -frame_graf = tk.Frame(root) -frame_graf.pack(pady=3) - -# --------------------------- -# Estado inicial -# --------------------------- -#generar() # crea y dibuja datos al abrir - -root.mainloop() # inicia la app \ No newline at end of file diff --git a/participacionGUIVisualizador/Ordenamiento_bubble.gif b/participacionGUIVisualizador/Ordenamiento_bubble.gif deleted file mode 100644 index 471f8e7..0000000 Binary files a/participacionGUIVisualizador/Ordenamiento_bubble.gif and /dev/null differ diff --git a/quicksort.py b/quicksort.py new file mode 100644 index 0000000..55e9b2a --- /dev/null +++ b/quicksort.py @@ -0,0 +1,72 @@ +import tkinter as tk +from tkinter import messagebox + +from matplotlib.figure import Figure +from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg + +def quick_sort(arr): + if len(arr)<=1: + return arr + + pivot = arr[len(arr)//2] + + left = [x for x in arr if x pivot] + + print(f"Left: {left} Middle: {middle} Right: {right}") + return quick_sort(left)+middle+quick_sort(right) + +# --- Función que se llama al presionar el botón --- + +def mostrar_grafico(original, ordenado): + fig = Figure(figsize=(6, 3), dpi=100) + + # Subgráficos: antes y después + ax1 = fig.add_subplot(121) + ax2 = fig.add_subplot(122) + + # Gráfico de barras original + ax1.bar(range(len(original)), original, color='skyblue') + ax1.set_title("Antes") + ax1.set_xticks([]) + + # Gráfico de barras ordenado + ax2.bar(range(len(ordenado)), ordenado, color='lightgreen') + ax2.set_title("Después") + ax2.set_xticks([]) + + # Dibujar en el canvas de tkinter + canvas = FigureCanvasTkAgg(fig, master=ventana) + canvas.draw() + canvas.get_tk_widget().pack(pady=10) + +def ordenar(): + entrada = entrada_txt.get() + try: + # Convertimos la entrada en una lista de enteros + numeros = list(map(int, entrada.split(','))) + ordenado = quick_sort(numeros) + resultado_lbl.config(text="Arreglo ordenado: " + str(ordenado)) + mostrar_grafico(numeros, ordenado) + except ValueError: + messagebox.showerror("Error", "Por favor ingresa solo números separados por comas.") + +# --- Interfaz gráfica --- +ventana = tk.Tk() +ventana.title("Quick Sort con Gráfica") +ventana.geometry("700x500") + +instruccion_lbl = tk.Label(ventana, text="Ingresa números separados por comas:") +instruccion_lbl.pack(pady=5) + +entrada_txt = tk.Entry(ventana, width=50) +entrada_txt.pack(pady=5) + +ordenar_btn = tk.Button(ventana, text="Ordenar", command=ordenar) +ordenar_btn.pack(pady=10) + +resultado_lbl = tk.Label(ventana, text="") +resultado_lbl.pack(pady=5) + +ventana.mainloop() \ No newline at end of file