How it works
Distribution sort suitable when number of elements and range of possible values are roughly the same.
Implementation
function pigeonholeSort(arr) { const min = Math.min(...arr), max = Math.max(...arr); const range = max - min + 1; const holes = new Array(range).fill(0); for (const v of arr) holes[v - min]++; let idx = 0; for (let i = 0; i < range; i++) while (holes[i]-- > 0) arr[idx++] = i + min; }
def pigeonhole_sort(arr): mi, mx = min(arr), max(arr) rng = mx - mi + 1 holes = [0] * rng for v in arr: holes[v - mi] += 1 idx = 0 for i in range(rng): while holes[i] > 0: arr[idx] = i + mi; idx += 1 holes[i] -= 1
void pigeonholeSort(vector<int>& arr) { int mi = *min_element(arr.begin(), arr.end()); int mx = *max_element(arr.begin(), arr.end()); int range = mx - mi + 1; vector<int> holes(range, 0); for (int v : arr) holes[v - mi]++; int idx = 0; for (int i = 0; i < range; i++) while (holes[i]-- > 0) arr[idx++] = i + mi; }
void PigeonholeSort(int[] arr) { int min = arr.Min(), max = arr.Max(); int range = max - min + 1; int[] holes = new int[range]; foreach (int v in arr) holes[v - min]++; int idx = 0; for (int i = 0; i < range; i++) while (holes[i]-- > 0) arr[idx++] = i + min; }
void pigeonholeSort(int arr[], int n) { int min = arr[0], max = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] < min) min = arr[i]; if (arr[i] > max) max = arr[i]; } int range = max - min + 1; int holes[range]; memset(holes, 0, sizeof(holes)); for (int i = 0; i < n; i++) holes[arr[i]-min]++; int idx = 0; for (int i = 0; i < range; i++) while (holes[i]-- > 0) arr[idx++] = i + min; }