Me he dado cuenta de que la función de clasificación de Javascript es extremadamente lenta en las versiones de Internet Explorer inferiores a 9 (a menudo en un orden de magnitud en comparación con Firefox y otros). mi propia versión para ver si puedo hacerlo mejor. Merge Sort funciona decentemente, pero parece que la mayoría de la documentación para clasificar algoritmos supone que las matrices se implementan como bloques contiguos de memoria. Las matrices Javascript se implementan como objetos (al menos en navegadores antiguos))Clasificación que conoce la forma única en que Javascript representa las matrices
Me preguntaba, ¿hay algún algoritmo de clasificación que tenga en cuenta que el acceso a arreglos es más caro que lo habitual? Es decir, uno que trata de optimizar no solo el número de comparaciones, sino también el número accesos y el costo de crear ne w arrays a través de cosas como splice
y slice
. Aquí está mi intento de fusionar el género.
function mergeSort(array, compareFunc) {
if (array.length <= 1) {
return;
}
var mid = Math.floor(array.length/2);
var left = array.splice(0, mid);
var right = array.splice(0, array.length);
mergeSort(left, compareFunc);
mergeSort(right, compareFunc);
while ((left.length > 0) && (right.length > 0))
{
if (compareFunc(left[0], right[0]) <= 0) {
array.push(left.shift());
}
else {
array.push(right.shift());
}
}
while (left.length > 0) {
array.push(left.shift());
}
while (right.length > 0) {
array.push(right.shift());
}
return;
}
No es una respuesta directa a su pregunta, pero esos dos bucles en la parte inferior realmente deberían ser 'concat's. – Josh