How it works
Distribution sort suitable when number of elements and range of possible values are roughly the same.
Implementation
function pigeonholeSort(arr, stats) { const n = arr.length; if (n < 1) return; let min = arr[0], max = arr[0]; for (let i = 1; i < n; i++) { stats.comparisons += 2; if (arr[i] < min) min = arr[i]; if (arr[i] > max) max = arr[i]; } let range = max - min + 1; let holes = new Array(range).fill(0); for (let i = 0; i < n; i++) { holes[arr[i] - min]++; } let index = 0; for (let j = 0; j < range; j++) { while (holes[j] > 0) { holes[j]--; arr[index] = j + min; write(index, j + min); markSorted(index); index++; } } }
def pigeonholeSort(arr, stats): if (n < 1): return min = arr[0] max = arr[0] for i in range(1, n): if (arr[i] < min): min = arr[i] if (arr[i] > max): max = arr[i] range = ((max - min) + 1) holes = [0] * range for i in range(n): holes[(arr[i] - min)] += 1 index = 0 for j in range(range): while (holes[j] > 0): holes[j] -= 1 arr[index] = (j + min) write(index, (j + min)) markSorted(index) index += 1
#include <vector> #include <algorithm> void sort(std::vector<int>& arr, int n, int& comparisons, int& swaps) { if((n < 1)) { return; } int min = arr[0]; int max = arr[0]; for(int i=1; i<n; i++) { comparisons += 2; if((arr[i] < min)) { min = arr[i]; } if((arr[i] > max)) { max = arr[i]; } } int range = ((max - min) + 1); std::vector<int> holes(range, 0); for(int i=0; i<n; i++) { holes[(arr[i] - min)]++; } int index = 0; for(int j=0; j<range; j++) { while((holes[j] > 0)) { holes[j]--; arr[index] = (j + min); write(index, (j + min)); markSorted(index); index++; } } }
public void Sort(int[] arr, int n, dynamic stats) { if((n < 1)) { return; } int min = arr[0]; int 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 = new int[range]; for(int i=0; i<n; i++) { holes[(arr[i] - min)]++; } int index = 0; for(int j=0; j<range; j++) { while((holes[j] > 0)) { holes[j]--; arr[index] = (j + min); write(index, (j + min)); markSorted(index); index++; } } }
#include <stdio.h> #include <string.h> #include <stdlib.h> void sort(int arr[], int n, int* comparisons, int* swaps) { if((n < 1)) { return; } int min = arr[0]; int 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 = (int*)malloc((range) * sizeof(int)); memset(holes, 0, (range) * sizeof(int)); for(int i=0; i<n; i++) { holes[(arr[i] - min)]++; } int index = 0; for(int j=0; j<range; j++) { while((holes[j] > 0)) { holes[j]--; arr[index] = (j + min); write(index, (j + min)); markSorted(index); index++; } } }