How it works
Simulates beads falling under gravity on an abacus. Each value is represented as a row of beads that drop into place.
Implementation
function gravitySort(arr) { const max = Math.max(...arr); const grid = Array.from({length: arr.length}, () => new Array(max).fill(0)); for (let i = 0; i < arr.length; i++) for (let j = 0; j < arr[i]; j++) grid[i][j] = 1; for (let col = 0; col < max; col++) { let beads = 0; for (let row = 0; row < arr.length; row++) { beads += grid[row][col]; grid[row][col] = 0; } for (let row = arr.length-1; row >= arr.length-beads; row--) grid[row][col] = 1; } for (let i = 0; i < arr.length; i++) arr[i] = grid[i].reduce((a,v) => a+v, 0); }
def gravity_sort(arr): mx = max(arr) grid = [[0]*mx for _ in range(len(arr))] for i in range(len(arr)): for j in range(arr[i]): grid[i][j] = 1 for col in range(mx): beads = sum(grid[row][col] for row in range(len(arr))) for row in range(len(arr)): grid[row][col] = 0 for row in range(len(arr)-1, len(arr)-1-beads, -1): grid[row][col] = 1 for i in range(len(arr)): arr[i] = sum(grid[i])
void gravitySort(vector<int>& arr) { int mx = *max_element(arr.begin(), arr.end()); vector<vector<int>> grid(arr.size(), vector<int>(mx, 0)); for (int i = 0; i < (int)arr.size(); i++) for (int j = 0; j < arr[i]; j++) grid[i][j] = 1; for (int col = 0; col < mx; col++) { int beads = 0; for (int r = 0; r < (int)arr.size(); r++) { beads += grid[r][col]; grid[r][col] = 0; } for (int r = arr.size()-1; r >= (int)arr.size()-beads; r--) grid[r][col] = 1; } for (int i = 0; i < (int)arr.size(); i++) arr[i] = accumulate(grid[i].begin(), grid[i].end(), 0); }
void GravitySort(int[] arr) { int max = arr.Max(); int[,] grid = new int[arr.Length, max]; for (int i = 0; i < arr.Length; i++) for (int j = 0; j < arr[i]; j++) grid[i,j] = 1; for (int col = 0; col < max; col++) { int beads = 0; for (int r = 0; r < arr.Length; r++) { beads += grid[r,col]; grid[r,col] = 0; } for (int r = arr.Length-1; r >= arr.Length-beads; r--) grid[r,col] = 1; } for (int i = 0; i < arr.Length; i++) { arr[i] = 0; for (int j = 0; j < max; j++) arr[i] += grid[i,j]; } }
void gravitySort(int arr[], int n) { int max = arr[0]; for (int i = 1; i < n; i++) if (arr[i] > max) max = arr[i]; int grid[n][max]; memset(grid, 0, sizeof(grid)); for (int i = 0; i < n; i++) for (int j = 0; j < arr[i]; j++) grid[i][j] = 1; for (int col = 0; col < max; col++) { int beads = 0; for (int r = 0; r < n; r++) { beads += grid[r][col]; grid[r][col] = 0; } for (int r = n-1; r >= n-beads; r--) grid[r][col] = 1; } for (int i = 0; i < n; i++) { arr[i] = 0; for (int j = 0; j < max; j++) arr[i] += grid[i][j]; } }