Этот цикл в основном делает то же самое, более в Javascript-y:
for (var div = 1, radix = 16; div < 65536 * 65536; div *= radix) {
var piles = [];
for (var i = 0; i < a.length; ++i) {
var p = Math.floor(a[i] / div) % radix;
(piles[p] || (piles[p] = [])).push(a[i]);
}
for (var i = 0, ai = 0; i < piles.length; ++i) {
if (!piles[i]) continue;
for (var pi = 0; pi < piles[i].length; ++pi)
a[ai++] = piles[i][pi];
}
}
Вместо того, чтобы делать это так, как мог бы программист на С, этот цикл создает список списков, по одному списку для каждого.возможное 4-битное значение.Я избегаю операторов сдвига битов, потому что это Javascript, и хотя они работают , все становится смешным, когда числа становятся большими.
Начиная с младших 4 битов каждого значения в «а»,код копирует этот элемент «a» в конец одной из «груд», которая соответствует 4-битному значению.Затем он собирает груды и восстанавливает «a», начиная со всех значений, младшие 4 бита которых были 0, затем 1 и т. Д. (Ясно, что будут некоторые пробелы, поэтому они пропускаются.) В конце каждой итерацииделения общего цикла делитель умножается на основание, так что будет рассмотрен следующий набор из 4 битов.
Как только делитель исчерпал доступный диапазон целых чисел, это делается.
Обратите внимание, что это будет работать только для положительных чисел.Делать это с отрицательными числами становится немного странно;может быть проще выделить отрицательные числа в отдельный массив, перевернуть знак, отсортировать, а затем развернуть.Сортируйте положительные числа, а затем, наконец, приклейте обратные отрицательные числа (снова переворачивая знаки) в начало отсортированных положительных чисел.