How it works
Bitwise most-significant-bit-first partitioning radix sort for integer keys.
Implementation
function binaryMSDRadixSort(arr, stats) { function sort(lo, hi, bit) { if (lo >= hi || bit < 0) return; let i = lo; let j = hi; while (i <= j) { while (i <= j) { const left = (arr[i] ^ 0x80000000) >>> bit; if ((left & 1) !== 0) break; i++; } while (i <= j) { const right = (arr[j] ^ 0x80000000) >>> bit; if ((right & 1) === 0) break; j--; } if (i < j) { swap(i, j); const t = arr[i]; arr[i] = arr[j]; arr[j] = t; i++; j--; } } sort(lo, j, bit - 1); sort(i, hi, bit - 1); } if (arr.length > 1) sort(0, arr.length - 1, 31); }
def sort(arr, n, stats): def sort(lo, hi, bit): if ((lo >= hi) or (bit < 0)): return i = lo j = hi while (i <= j): while (i <= j): left = ((arr[i] ^ 0x80000000) >>> bit) if ((left & 1) != 0): break i += 1 while (i <= j): right = ((arr[j] ^ 0x80000000) >>> bit) if ((right & 1) == 0): break j -= 1 if (i < j): t = arr[i] arr[i] = arr[j] arr[j] = t i += 1 j -= 1 sort(lo, j, (bit - 1)) sort(i, hi, (bit - 1)) if (len(arr) > 1): sort(0, (len(arr) - 1), 31)
#include <vector> #include <algorithm> void sort(std::vector<int>& arr, int n, int& comparisons, int& swaps) { void sort(int lo, int hi, int bit) { if(((lo >= hi) || (bit < 0))) { return; } int i = lo; int j = hi; while((i <= j)) { while((i <= j)) { int left = ((arr[i] ^ 0x80000000) >>> bit); if(((left & 1) != 0)) { break; } i++; } while((i <= j)) { int right = ((arr[j] ^ 0x80000000) >>> bit); if(((right & 1) == 0)) { break; } j--; } if((i < j)) { int t = arr[i]; arr[i] = arr[j]; arr[j] = t; i++; j--; } } sort(lo, j, (bit - 1)); sort(i, hi, (bit - 1)); } if((n > 1)) { sort(0, (n - 1), 31); } }
public void Sort(int[] arr, int n, dynamic stats) { void sort(int lo, int hi, int bit) { if(((lo >= hi) || (bit < 0))) { return; } int i = lo; int j = hi; while((i <= j)) { while((i <= j)) { int left = ((arr[i] ^ 0x80000000) >>> bit); if(((left & 1) != 0)) { break; } i++; } while((i <= j)) { int right = ((arr[j] ^ 0x80000000) >>> bit); if(((right & 1) == 0)) { break; } j--; } if((i < j)) { int t = arr[i]; arr[i] = arr[j]; arr[j] = t; i++; j--; } } sort(lo, j, (bit - 1)); sort(i, hi, (bit - 1)); } if((n > 1)) { sort(0, (n - 1), 31); } }
#include <stdio.h> void sort(int arr[], int n, int* comparisons, int* swaps) { void sort(int lo, int hi, int bit) { if(((lo >= hi) || (bit < 0))) { return; } int i = lo; int j = hi; while((i <= j)) { while((i <= j)) { int left = ((arr[i] ^ 0x80000000) >>> bit); if(((left & 1) != 0)) { break; } i++; } while((i <= j)) { int right = ((arr[j] ^ 0x80000000) >>> bit); if(((right & 1) == 0)) { break; } j--; } if((i < j)) { int t = arr[i]; arr[i] = arr[j]; arr[j] = t; i++; j--; } } sort(lo, j, (bit - 1)); sort(i, hi, (bit - 1)); } if((n > 1)) { sort(0, (n - 1), 31); } }