How it works
Distributes elements into buckets, sorts each bucket individually (usually with insertion sort), then concatenates.
Implementation
function bucketSort(arr) { const max = Math.max(...arr); const cnt = Math.floor(Math.sqrt(arr.length)); const bk = Array.from({length: cnt}, () => []); for (const v of arr) bk[Math.min(cnt-1, Math.floor(v/(max+1)*cnt))].push(v); let idx = 0; for (const b of bk) { b.sort((a, c) => a - c); for (const v of b) arr[idx++] = v; } }
def bucket_sort(arr): mx = max(arr) cnt = int(len(arr) ** 0.5) bk = [[] for _ in range(cnt)] for v in arr: bk[min(cnt-1, v * cnt // (mx+1))].append(v) idx = 0 for b in bk: b.sort() for v in b: arr[idx] = v; idx += 1
void bucketSort(vector<int>& arr) { int mx = *max_element(arr.begin(), arr.end()); int cnt = (int)sqrt(arr.size()); vector<vector<int>> bk(cnt); for (int v : arr) bk[min(cnt-1, (int)((long)v*cnt/(mx+1)))].push_back(v); int idx = 0; for (auto& b : bk) { sort(b.begin(), b.end()); for (int v : b) arr[idx++] = v; } }
void BucketSort(int[] arr) { int max = arr.Max(); int cnt = (int)Math.Sqrt(arr.Length); var bk = Enumerable.Range(0, cnt) .Select(_ => new List<int>()).ToArray(); foreach (int v in arr) bk[Math.Min(cnt-1, v*cnt/(max+1))].Add(v); int idx = 0; foreach (var b in bk) { b.Sort(); foreach (int v in b) arr[idx++] = v; } }
void bucketSort(int arr[], int n) { int max = arr[0]; for (int i = 1; i < n; i++) if (arr[i] > max) max = arr[i]; int cnt = (int)sqrt(n); // Create cnt buckets, distribute, sort each, // concatenate back into arr }