Bead Sort OR Gravity Sort Program with Explanation and Code
2025-11-19
bead sort
gravity sort
natural sorting algorithm
python bead sort
c bead sort
php bead sort
javascript bead sort
csharp bead sort
non-negative integer sorting
abacus sorting method
Bead Sort (Gravity Sort) is a natural sorting algorithm inspired by how beads fall on an abacus. It works only for non-negative integers and visually simulates gravity to arrange values. Includes complete implementations in Python, C, JavaScript, PHP, and C#.
Program Explanation
What is Bead Sort?
Bead Sort (also known as Gravity Sort) is a natural sorting algorithm inspired by the way beads fall under gravity on an abacus. It works only for non-negative integers and sorts the array by simulating beads dropping down rods. Larger numbers have more beads, so they settle lower, resulting in a sorted list. Although visually interesting, Bead Sort is not used in practical systems due to high complexity and memory usage.
Steps to Solve
- Find the maximum value in the array.
- Create a grid (rows = number of elements, columns = max value).
- Place beads on each row equal to the element's value.
- Let gravity pull the beads downward (count beads in each column).
- Rebuild each row's value based on bead counts.
- Convert the bead structure back into the sorted array.
Key Points
- Works only for non-negative integers.
- Simulates physical gravity to sort values.
- Time complexity can be O(n × maxValue) — expensive for large values.
- Simple concept but impractical for most real-world uses.
- Often used for educational and visual demonstrations.
Program Code
def bead_sort(arr):
if any(x < 0 for x in arr):
raise ValueError("Bead Sort works only for non-negative integers.")
max_val = max(arr)
beads = [[0] * max_val for _ in arr]
for i, num in enumerate(arr):
for j in range(num):
beads[i][j] = 1
for j in range(max_val):
sum_beads = sum(beads[i][j] for i in range(len(arr)))
for i in range(len(arr)):
beads[i][j] = 1 if i >= len(arr) - sum_beads else 0
for i in range(len(arr)):
arr[i] = sum(beads[i])
arr = list(map(int, input("Enter non-negative integers: ").split()))
bead_sort(arr)
print("Sorted array:", arr)
#include <stdio.h>
#include <string.h>
void beadSort(int arr[], int n) {
int max = 0;
for (int i = 0; i < n; i++)
if (arr[i] > max)
max = arr[i];
unsigned char beads[n][max];
memset(beads, 0, sizeof(beads));
for (int i = 0; i < n; i++)
for (int j = 0; j < arr[i]; j++)
beads[i][j] = 1;
for (int j = 0; j < max; j++) {
int count = 0;
for (int i = 0; i < n; i++)
count += beads[i][j];
for (int i = 0; i < n; i++)
beads[i][j] = (i >= n - count) ? 1 : 0;
}
for (int i = 0; i < n; i++) {
int num = 0;
for (int j = 0; j < max; j++)
num += beads[i][j];
arr[i] = num;
}
}
int main() {
int n;
printf("Enter number of elements: ");
scanf("%d", &n);
int arr[n];
printf("Enter non-negative integers: ");
for (int i = 0; i < n; i++)
scanf("%d", &arr[i]);
beadSort(arr, n);
printf("Sorted array: ");
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
return 0;
}
function beadSort(arr) {
if (arr.some(x => x < 0)) {
console.error("Bead Sort works only for non-negative integers.");
return;
}
let max = Math.max(...arr);
let beads = Array.from({ length: arr.length }, () => Array(max).fill(0));
arr.forEach((num, i) => {
for (let j = 0; j < num; j++)
beads[i][j] = 1;
});
for (let j = 0; j < max; j++) {
let count = beads.reduce((sum, row) => sum + row[j], 0);
for (let i = 0; i < arr.length; i++)
beads[i][j] = i >= arr.length - count ? 1 : 0;
}
for (let i = 0; i < arr.length; i++)
arr[i] = beads[i].reduce((a, b) => a + b);
return arr;
}
let arr = prompt("Enter non-negative integers:").split(" ").map(Number);
console.log("Sorted array:", beadSort(arr));
using System;
class Program {
static void BeadSort(int[] arr) {
int n = arr.Length;
int max = 0;
foreach (int num in arr)
if (num > max)
max = num;
int[,] beads = new int[n, max];
for (int i = 0; i < n; i++)
for (int j = 0; j < arr[i]; j++)
beads[i, j] = 1;
for (int j = 0; j < max; j++) {
int count = 0;
for (int i = 0; i < n; i++)
count += beads[i, j];
for (int i = 0; i < n; i++)
beads[i, j] = (i >= n - count) ? 1 : 0;
}
for (int i = 0; i < n; i++) {
int val = 0;
for (int j = 0; j < max; j++)
val += beads[i, j];
arr[i] = val;
}
}
static void Main() {
Console.Write("Enter non-negative integers: ");
int[] arr = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);
BeadSort(arr);
Console.Write("Sorted array: ");
foreach (int x in arr) Console.Write(x + " ");
}
}
<?php
function beadSort(&$arr) {
foreach ($arr as $num)
if ($num < 0)
die("Bead Sort requires non-negative integers.\n");
$n = count($arr);
$max = max($arr);
$beads = array_fill(0, $n, array_fill(0, $max, 0));
for ($i = 0; $i < $n; $i++)
for ($j = 0; $j < $arr[$i]; $j++)
$beads[$i][$j] = 1;
for ($j = 0; $j < $max; $j++) {
$count = 0;
for ($i = 0; $i < $n; $i++)
$count += $beads[$i][$j];
for ($i = 0; $i < $n; $i++)
$beads[$i][$j] = ($i >= $n - $count) ? 1 : 0;
}
for ($i = 0; $i < $n; $i++)
$arr[$i] = array_sum($beads[$i]);
}
$arr = array_map('intval', explode(" ", readline("Enter non-negative integers: ")));
beadSort($arr);
echo "Sorted array: " . implode(" ", $arr);
?>
