├── .gitattributes ├── videos ├── part1.gif └── part2.gif ├── js ├── Pathfinding Algs │ ├── alg.js │ ├── dfs.js │ ├── bfs.js │ ├── greedy.js │ ├── dijkstra.js │ └── astar.js ├── grid.js ├── maze.js ├── tiles.js ├── sorting.js └── index.js ├── sorting.html ├── index.html ├── README.md └── style.css /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /videos/part1.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/btschneid/Pathfinding-and-Sorting-Visualizer/HEAD/videos/part1.gif -------------------------------------------------------------------------------- /videos/part2.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/btschneid/Pathfinding-and-Sorting-Visualizer/HEAD/videos/part2.gif -------------------------------------------------------------------------------- /js/Pathfinding Algs/alg.js: -------------------------------------------------------------------------------- 1 | //////////////////////////////////////////////////////////////////////////////////////////////////////////////// 2 | // Algorithms 3 | //////////////////////////////////////////////////////////////////////////////////////////////////////////////// 4 | let visitedTiles = [] 5 | 6 | const buildGraph = () => { 7 | const graph = {}; 8 | 9 | for (let i = 0; i < tiles.length; i++) { 10 | const tile = tiles[i]; 11 | graph[tile.number] = []; 12 | 13 | for (let j = 0; j < tile.neighbors.length; j++) { 14 | const neighbor = tile.neighbors[j]; 15 | graph[tile.number].push(neighbor.number); 16 | } 17 | } 18 | return graph; 19 | } 20 | 21 | const resetVisitedTiles = () => { 22 | for (let i = 0; i < visitedTiles.length; i++) { 23 | if (visitedTiles[i].number !== startTile && visitedTiles[i].number !== endTile) { 24 | visitedTiles[i].element.style.backgroundColor = 'white'; 25 | } 26 | } 27 | 28 | visitedTiles = []; 29 | } 30 | 31 | 32 | const checkToStart = () => { 33 | return (endTile > -1 && startTile > -1); 34 | } -------------------------------------------------------------------------------- /js/Pathfinding Algs/dfs.js: -------------------------------------------------------------------------------- 1 | /////////////////////// 2 | // DFS 3 | /////////////////////// 4 | 5 | const dfs = () => { 6 | pathFindingDone = false; 7 | currentAlg = 1; 8 | dfsTime(30) 9 | } 10 | 11 | async function dfsTime(delayTime) { 12 | selectedColor = ''; 13 | if (!checkToStart()) { 14 | return; 15 | } 16 | 17 | editMode = false; 18 | resetOn = false; 19 | updateTileNeighbors(); 20 | const graph = buildGraph(); 21 | const visited = new Set([startTile]); 22 | const array = [[startTile, 0]]; 23 | const prev = {}; 24 | let endNode = null; 25 | resetVisitedTiles(); 26 | 27 | outerLoop : while (array.length > 0) { 28 | if (resetOn) { 29 | break; 30 | } 31 | if (delayTime > 0) { 32 | await delay(delayTime); 33 | } 34 | const [node, distance] = array.pop(); 35 | 36 | if (node == endTile) { 37 | endNode = node; 38 | break; 39 | } 40 | 41 | for (let neighbor of graph[node]) { 42 | if (!visited.has(neighbor)) { 43 | visited.add(neighbor); 44 | array.push([neighbor, distance + 1]); 45 | if (neighbor !== startTile && neighbor !== endTile) { 46 | if (delayTime == 0) { 47 | tiles[neighbor].element.style.backgroundColor = '#75a7e6'; 48 | } else { 49 | visitedAnimation(tiles[neighbor], '#75a7e6'); 50 | } 51 | visitedTiles.push(tiles[neighbor]); 52 | } 53 | prev[neighbor] = node; 54 | if (endTile == neighbor) { 55 | endNode = neighbor; 56 | break outerLoop; 57 | } 58 | } 59 | } 60 | } 61 | 62 | // Color the path from end to start 63 | let node = endNode; 64 | while (node != startTile && !resetOn) { 65 | if (node !== endNode) { 66 | if (delayTime == 0) { 67 | tiles[node].element.style.backgroundColor = '#f5ff5e'; 68 | } else { 69 | visitedAnimation(tiles[node], '#f5ff5e'); 70 | await delay(delayTime); 71 | } 72 | } 73 | node = prev[node]; 74 | } 75 | 76 | pathFindingDone = true; 77 | 78 | } -------------------------------------------------------------------------------- /js/Pathfinding Algs/bfs.js: -------------------------------------------------------------------------------- 1 | /////////////////////// 2 | // BFS 3 | /////////////////////// 4 | 5 | const bfs = () => { 6 | pathFindingDone = false; 7 | currentAlg = 0; 8 | bfsTime(30) 9 | } 10 | 11 | async function bfsTime(delayTime) { 12 | selectedColor = ''; 13 | if (!checkToStart()) { 14 | return; 15 | } 16 | 17 | editMode = false; 18 | resetOn = false; 19 | updateTileNeighbors(); 20 | const graph = buildGraph(); 21 | const visited = new Set([startTile]); 22 | const queue = [[startTile, 0]]; 23 | const prev = {}; 24 | let endNode = null; 25 | resetVisitedTiles(); 26 | 27 | outerLoop : while (queue.length > 0) { 28 | if (resetOn) { 29 | break; 30 | } 31 | if (delayTime > 0) { 32 | await delay(delayTime); 33 | } 34 | const [node, distance] = queue.shift(); 35 | 36 | if (node == endTile) { 37 | endNode = node; 38 | break; 39 | } 40 | 41 | for (let neighbor of graph[node]) { 42 | if (!visited.has(neighbor)) { 43 | visited.add(neighbor); 44 | queue.push([neighbor, distance + 1]); 45 | if (neighbor !== startTile && neighbor !== endTile) { 46 | if (delayTime == 0) { 47 | tiles[neighbor].element.style.backgroundColor = '#75a7e6'; 48 | } else { 49 | visitedAnimation(tiles[neighbor], '#75a7e6'); 50 | } 51 | visitedTiles.push(tiles[neighbor]); 52 | } 53 | prev[neighbor] = node; 54 | if (endTile == neighbor) { 55 | endNode = neighbor; 56 | break outerLoop; 57 | } 58 | } 59 | } 60 | } 61 | 62 | // Color the path from end to start 63 | let node = endNode; 64 | while (node != startTile && !resetOn) { 65 | if (node !== endNode) { 66 | 67 | if (delayTime == 0) { 68 | tiles[node].element.style.backgroundColor = '#f5ff5e'; 69 | } else { 70 | visitedAnimation(tiles[node], '#f5ff5e'); 71 | await delay(delayTime); 72 | } 73 | } 74 | node = prev[node]; 75 | } 76 | 77 | pathFindingDone = true; 78 | 79 | } -------------------------------------------------------------------------------- /sorting.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |Comparisons: 0
31 |Swaps: 0
32 |Time complexity:
33 |
111 |