Spaces:
Sleeping
Sleeping
| import matplotlib.pyplot as plt | |
| from io import BytesIO | |
| import imageio | |
| import numpy as np | |
| def generate_bubble_sort_gif(values, output_path): | |
| """ | |
| Given a list of integer values (e.g. [5,3,8,1]), produce an animated GIF showing | |
| each comparison + swap step in bubble sort. Save the GIF to output_path. | |
| """ | |
| if not values: | |
| # Create a single frame with empty array if no values provided | |
| fig, ax = plt.subplots() | |
| ax.bar([], [], color="skyblue") | |
| ax.set_title("Bubble Sort: No values provided") | |
| buf = BytesIO() | |
| plt.savefig(buf, format='png') | |
| plt.close(fig) | |
| buf.seek(0) | |
| imageio.mimsave(output_path, [imageio.imread(buf)], format='GIF', fps=1) | |
| return output_path | |
| images = [] | |
| arr = values.copy() | |
| n = len(arr) | |
| # Always add initial state | |
| fig, ax = plt.subplots() | |
| ax.bar(range(len(arr)), arr, color="skyblue") | |
| ax.set_title("Bubble Sort: Initial State") | |
| buf = BytesIO() | |
| plt.savefig(buf, format='png') | |
| plt.close(fig) | |
| buf.seek(0) | |
| images.append(imageio.imread(buf)) | |
| # Perform bubble sort and capture each step | |
| for i in range(n): | |
| for j in range(0, n - i - 1): | |
| if arr[j] > arr[j + 1]: | |
| arr[j], arr[j + 1] = arr[j + 1], arr[j] | |
| # Plot current array state as a bar chart | |
| fig, ax = plt.subplots() | |
| ax.bar(range(len(arr)), arr, color="skyblue") | |
| ax.set_title(f"Bubble Sort: pass {i}, compare {j}") | |
| buf = BytesIO() | |
| plt.savefig(buf, format='png') | |
| plt.close(fig) | |
| buf.seek(0) | |
| images.append(imageio.imread(buf)) | |
| # Add final state if no swaps were made | |
| if len(images) == 1: | |
| fig, ax = plt.subplots() | |
| ax.bar(range(len(arr)), arr, color="skyblue") | |
| ax.set_title("Bubble Sort: Final State") | |
| buf = BytesIO() | |
| plt.savefig(buf, format='png') | |
| plt.close(fig) | |
| buf.seek(0) | |
| images.append(imageio.imread(buf)) | |
| # Save as GIF | |
| imageio.mimsave(output_path, images, format='GIF', fps=1) | |
| return output_path | |