Schnellste Möglichkeit, ein JS-Array basierend auf den Werten eines anderen Arrays zu sortieren?

8

Es gibt ähnliche Posts, aber ich kann nichts finden, was dieses spezielle Problem angeht ... Ich habe zwei Arrays von gepaarten Werten:

%Vor%

Was ist der prozessorfreundlichste Weg, um die Arrays so zu sortieren, dass Array A in numerischer aufsteigender Reihenfolge ist und die Datenstruktur beibehalten wird? Ich denke, eingebaut in Array.sort (Funktion) wäre am schnellsten, aber ich bin nicht zuversichtlich, die Syntax.

    
cronoklee 25.03.2011, 00:10
quelle

7 Antworten

11

Art von Hacky, aber es funktioniert.

%Vor%

jsFiddle .

Ausgabe

%Vor%

Grundsätzlich erstellen wir Objekte mit einem eindeutigen Zusammenhang zwischen A und B in einem neuen Array, und dann sort() ing das.

Dann gehe ich zurück und baue das Original der beiden Arrays neu.

Aktualisieren

Már Örlygsson macht einen guten Punkt in den Kommentaren. Anstatt ein Objekt wie {A: 0.5, B: 'a'} zu erstellen, schlägt er vor, die Werte A und B in Arrays wie [0.5, 'a'] zu platzieren.

Diese sollte schneller sein, obwohl sie etwas weniger lesbar ist, wenn Sie das all -Array debuggen müssen. Ich überlasse dies Ihnen, wenn Sie Leistungsprobleme haben, profilieren Sie beide Methoden und wählen Sie die schnellste aus.

    
alex 25.03.2011, 00:25
quelle
8

Ich bemerkte, dass alle oben genannten Lösungen eine Karte verwendeten. Eine andere Methode, die ein wenig Speicher spart, ist, ein Array von Indizes zu erstellen, die Indizes basierend auf A zu sortieren und dann A und B basierend auf den Indizes zu rekonstruieren.

%Vor%

Hier ist die jsfiddle

EDIT: Semi-One-Liner inspiriert von choweys Kommentar :

%Vor%     
woojoo666 10.03.2014 13:52
quelle
4

Es wäre viel einfacher, wenn Sie ein Array mit Tupeln anstelle von zwei Arrays hätten. Denn dann können Sie das Build-in Array.sort() verwenden.

%Vor%

Danach kannst du einfach schreiben:

%Vor%     
Elian Ebbing 25.03.2011 00:30
quelle
1
%Vor%

Array ist für Zahlen, Array2 ist für Strings, sie müssen gleich lang sein.

Dies ist Quicksort, also ist die Zeit O (N LogN)

Quelle ist literateprograms.org, Lizenz ist MIT, Modifikation, um das zweite von mir erstellte Array zu verwalten

    
Marino Šimić 25.03.2011 00:30
quelle
0

Bei jedem Sortieralgorithmus gibt es einen Kompromiss zwischen der Algorithmuszeit und anderen Einschränkungen (normalerweise Speicher). Vielleicht möchten Sie einen Blick auf Quicksort und Bubble Sort , zwei gebräuchliche und sehr schnelle Sortieralgorithmen. Sie müssten kleinere Änderungen vornehmen, da Sie eigentlich zwei Arrays sortieren, wobei das erste die Quelle der zu sortierenden Daten ist - aber diese Art der Änderung ist trivial.

EDIT: Anmerkung, array.sort () würde nicht für Sie arbeiten, da Sie möchten, dass Änderungen in arr1 in arr2 widergespiegelt werden. Sie müssen Ihre eigene Sortierfunktion schreiben

    
jordancpaul 25.03.2011 00:17
quelle
0

Setzen Sie die beiden Arrays vorher zusammen Die Art ist der einfachste Weg.

%Vor%     
kennebec 25.03.2011 01:42
quelle
-1

Sie könnten besser dran sein, wenn möglich, eine Datenstruktur zu erstellen. Auf diese Weise können Sie $A[] basierend auf einer Eigenschaft sortieren, während Sie die Struktur beibehalten. Ich habe keine Geschwindigkeitstests oder irgendetwas gemacht, aber vielleicht etwas wie ...

%Vor%     
Dutchie432 25.03.2011 00:27
quelle

Tags und Links