Ich möchte einen Trick teilen, den ich routinemäßig in C/C++ für qsort()
verwende.
JS 'sort() erlaubt die Angabe einer Vergleichsfunktion. Erstellen Sie ein zweites Array der gleichen Länge und füllen Sie es mit steigenden Zahlen von 0.
function stableSorted(array, compareFunction) {
compareFunction = compareFunction || defaultCompare;
var indicies = new Array(array.length);
for (var i = 0; i < indicies.length; i++)
indicies[i] = i;
Dies sind Indizes in das ursprüngliche Array. Wir werden das zweite Array sortieren. Erstellen Sie eine benutzerdefinierte Vergleichsfunktion.
Es wird die zwei Elemente aus dem zweiten Array erhalten: Verwenden Sie sie als Indizes in die ursprünglichen Arrays und vergleichen Sie die Elemente.
Wenn Elemente gleich sind, vergleichen Sie ihre Indizes, um die Reihenfolge stabil zu machen.
if (a < b)
return -1;
else
return 1;
});
nach der Sortierung() würde das zweite Array-Indizes enthalten, die man die Elemente des ursprünglichen Arrays in stabiler sortierter Reihenfolge zugreifen können.
var sorted = new Array(array.length);
for (var i = 0; i < sorted.length; i++)
sorted[i] = array[indicies[i]];
return sorted;
}
// The default comparison logic used by Array.sort(), if compareFunction is not provided:
function defaultCompare(a, b) {
a = String(a);
b = String(b);
if (a < b) return -1;
else if (a > b) return 1;
else return 0;
}
Im Allgemeinen stabilen Sortieralgorithmen nur fällig werden und erfordert noch mehr zusätzlichen Speicher im Vergleich zu dem guten alten qsort. Ich denke, das ist der Grund, warum nur wenige Spezifikationen eine stabile Sortierung verlangen.
Es wäre nützlich, dies zu aktualisieren. – ColBeseder
Sieht so aus, als würde Chrome (V8) so bleiben: http://code.google.com/p/v8/issues/detail?id=90 –
http://ofb.net/~sethml/is-sort-stable .html? (Ich habe es für alle Fälle im Webarchiv gespeichert.) – Pierre