mehranmamonai/sorting_graph
0
1import streamlit as st2import numpy as np3import pandas as pd4import time5 6st.set_page_config(page_title="Sorting Visualization", page_icon="🫧", layout="wide")7st.title("🫧 Bubble Sort vs Merge Sort (Same Data)")8 9# ---------------- Session State: one fixed dataset ----------------10if "base_numbers" not in st.session_state:11 st.session_state.base_numbers = np.random.randint(1, 100, 10)12 13# ---------------- Controls ----------------14c1, c2 = st.columns(2)15with c1:16 if st.button("🔄 Randomize Numbers"):17 st.session_state.base_numbers = np.random.randint(1, 100, 10)18with c2:19 start_sorting = st.button("▶️ Start Sorting")20 21# ---------------- Layout: two charts side by side ----------------22left, right = st.columns(2)23 24left.subheader("Bubble Sort")25bubble_chart = left.empty()26bubble_timer = left.empty()27 28right.subheader("Merge Sort")29merge_chart = right.empty()30merge_timer = right.empty()31 32# Show the SAME starting data in both charts33base_df = pd.DataFrame({"Index": list(range(1, 11)), "Value": st.session_state.base_numbers})34bubble_chart.bar_chart(base_df.set_index("Index"))35merge_chart.bar_chart(base_df.set_index("Index"))36 37# ---------------- Bubble Sort (animated) ----------------38def bubble_sort_animation(arr):39 n = len(arr)40 for i in range(n):41 for j in range(0, n - i - 1):42 if arr[j] > arr[j + 1]:43 arr[j], arr[j + 1] = arr[j + 1], arr[j]44 # update chart every comparison45 df = pd.DataFrame({"Index": list(range(1, n + 1)), "Value": arr})46 bubble_chart.bar_chart(df.set_index("Index"))47 time.sleep(0.25)48 return arr49 50# ---------------- Merge Sort (animated: updates after each merge) ----------------51def merge_sort_animation(arr):52 def merge(arr, l, m, r):53 L = arr[l:m+1]54 R = arr[m+1:r+1]55 i = j = 056 k = l57 while i < len(L) and j < len(R):58 if L[i] <= R[j]:59 arr[k] = L[i]; i += 160 else:61 arr[k] = R[j]; j += 162 k += 163 while i < len(L):64 arr[k] = L[i]; i += 1; k += 165 while j < len(R):66 arr[k] = R[j]; j += 1; k += 167 68 def mergesort(arr, l, r):69 if l < r:70 m = (l + r) // 271 mergesort(arr, l, m)72 mergesort(arr, m + 1, r)73 merge(arr, l, m, r)74 # update chart after each merge operation75 df = pd.DataFrame({"Index": list(range(1, len(arr) + 1)), "Value": arr})76 merge_chart.bar_chart(df.set_index("Index"))77 time.sleep(0.25)78 79 mergesort(arr, 0, len(arr) - 1)80 return arr81 82# ---------------- Start sorting (each uses a COPY of the same data) ----------------83if start_sorting:84 # Copies so original stays fixed for comparison85 bubble_arr = st.session_state.base_numbers.copy()86 merge_arr = st.session_state.base_numbers.copy()87 88 # Bubble Sort timing89 bubble_timer.info("⏳ Bubble Sort started...")90 t0 = time.time()91 bubble_sort_animation(bubble_arr)92 bubble_elapsed = time.time() - t093 bubble_timer.success(f"✅ Bubble Sort completed in {bubble_elapsed:.2f} seconds!")94 95 # Merge Sort timing96 merge_timer.info("⏳ Merge Sort started...")97 t1 = time.time()98 merge_sort_animation(merge_arr)99 merge_elapsed = time.time() - t1100 merge_timer.success(f"✅ Merge Sort completed in {merge_elapsed:.2f} seconds!")101 