Cette boucle fait essentiellement la même chose, d'une façon plus 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];
}
}
au lieu de le faire comme un programmeur C pourrait, cette boucle construit une liste de listes, une liste pour chaque possible Valeur 4 bits J'évite les opérateurs de décalage de bits parce que c'est Javascript et alors qu'ils font travaillent, les choses deviennent drôles quand les nombres deviennent grands. En commençant par les 4 bits les plus faibles de chaque valeur de "a", le code copie cet élément de "a" à la fin de l'une des "piles", c'est-à-dire celle correspondant à la valeur de 4 bits. Il rassemble ensuite les piles et reconstruit "a" à partir de toutes les valeurs dont les 4 bits bas étaient 0, puis 1, etc. (Clairement, il y aura des trous, donc ceux-ci sont ignorés.) A la fin de chaque itération de la boucle globale, le diviseur est multiplié par la base, de sorte que l'ensemble suivant de 4 bits sera examiné.
Une fois que le diviseur a épuisé la plage disponible d'entiers, c'est fait.
Notez que cela fonctionnera uniquement pour positifs nombres. Faire cela avec des nombres négatifs devient un peu bizarre; il pourrait être plus facile de supprimer les nombres négatifs dans un tableau séparé, de retourner le signe, de trier, puis de retourner. Trier les nombres positifs, puis enfin coller les nombres négatifs inversés (retournant les signes) à l'avant des nombres positifs triés. `A` contient le tableau d'entrée des entiers?
Pourquoi ne mettez-vous pas à zéro les fonctions 'count',' pref' et 'groups'? Les tableaux dans JS, même lorsqu'ils sont créés via 'new Array (length)' commencent avec un contenu indéfini, et 'undefined + 0' est' NaN'. –
@Mike: D'abord, je ne suis même pas tout à fait sûr comment ce genre est supposé fonctionner, donc je ne suis pas sûr de ce qui est cassé. 'count' est déjà mis à zéro,' pref' est initialisé avant d'être utilisé, et 'groups' n'est pas un tableau. –
Un tri de * radix * trie en regardant des pièces de la clé de tri, des pièces suffisamment petites pour que toutes les valeurs possibles d'une pièce puissent décrire un nombre gérable de listes discrètes. Imaginez trier votre collection de CD: faites d'abord des piles par la deuxième lettre du nom de l'artiste, puis passez les piles A - Z et faites de nouvelles piles par première lettre. Lorsque vous reprenez les piles A et Z et que vous les alignez de gauche à droite sur une étagère, elles sont triées! – Pointy