"use client" import { useState, useEffect } from "react" import { Button } from "@/components/ui/button" import { DropdownMenu, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuRadioGroup, DropdownMenuRadioItem } from "@/components/ui/dropdown-menu" import { Slider } from "@/components/ui/slider" export default function Component() { const [array, setArray] = useState([]) const [isRunning, setIsRunning] = useState(false) const [currentAlgorithm, setCurrentAlgorithm] = useState("bubble") const [arraySize, setArraySize] = useState(20) useEffect(() => { generateRandomArray(arraySize) }, [arraySize]) const generateRandomArray = (size: number) => { const newArray = Array.from({ length: size }, () => Math.floor(Math.random() * 100)) setArray(newArray) } const shuffleArray = () => { const shuffledArray = [...array].sort(() => Math.random() - 0.5) setArray(shuffledArray) } const startAnimation = () => { setIsRunning(true) switch (currentAlgorithm) { case "bubble": bubbleSort() break case "insertion": insertionSort() break case "merge": mergeSort(array, 0, array.length - 1) break default: break } } const pauseAnimation = () => { setIsRunning(false) } const resetAnimation = () => { setIsRunning(false) generateRandomArray(arraySize) } const bubbleSort = async () => { const newArray = [...array] for (let i = 0; i < newArray.length; i++) { for (let j = 0; j < newArray.length - i - 1; j++) { if (newArray[j] > newArray[j + 1]) { ;[newArray[j], newArray[j + 1]] = [newArray[j + 1], newArray[j]] setArray([...newArray]) await new Promise((resolve) => setTimeout(resolve, 100)) } } } setIsRunning(false) } const insertionSort = async () => { const newArray = [...array] for (let i = 1; i < newArray.length; i++) { const key = newArray[i] let j = i - 1 while (j >= 0 && newArray[j] > key) { newArray[j + 1] = newArray[j] j = j - 1 setArray([...newArray]) await new Promise((resolve) => setTimeout(resolve, 100)) } newArray[j + 1] = key setArray([...newArray]) await new Promise((resolve) => setTimeout(resolve, 100)) } setIsRunning(false) } const mergeSort = async (arr: number[], left: number, right: number) => { if (left < right) { const mid = Math.floor((left + right) / 2) await mergeSort(arr, left, mid) await mergeSort(arr, mid + 1, right) await merge(arr, left, mid, right) } } const merge = async (arr: number[], left: number, mid: number, right: number) => { const n1 = mid - left + 1 const n2 = right - mid const leftArr = new Array(n1) const rightArr = new Array(n2) for (let i = 0; i < n1; i++) leftArr[i] = arr[left + i] for (let j = 0; j < n2; j++) rightArr[j] = arr[mid + 1 + j] let i = 0, j = 0, k = left while (i < n1 && j < n2) { if (leftArr[i] <= rightArr[j]) { arr[k] = leftArr[i] i++ } else { arr[k] = rightArr[j] j++ } setArray([...arr]) await new Promise((resolve) => setTimeout(resolve, 100)) k++ } while (i < n1) { arr[k] = leftArr[i] i++ k++ setArray([...arr]) await new Promise((resolve) => setTimeout(resolve, 100)) } while (j < n2) { arr[k] = rightArr[j] j++ k++ setArray([...arr]) await new Promise((resolve) => setTimeout(resolve, 100)) } } return (

Algorithm Visualizer

{array.map((value, index) => (
))}
{currentAlgorithm.charAt(0).toUpperCase() + currentAlgorithm.slice(1)} Sort Bubble Sort Insertion Sort Merge Sort
setArraySize(value[0])} min={5} max={100} />
) } function ArrowUpDownIcon(props) { return ( ) }