Wie funktioniert sort () von Javascript?


91

Wie sortiert der folgende Code dieses Array in numerischer Reihenfolge?

var array=[25, 8, 7, 41]

array.sort(function(a,b){
  return a - b
})

Ich weiß, dass, wenn das Ergebnis der Berechnung ist ...

Weniger als 0 : "a" ist so sortiert, dass es einen niedrigeren Index als "b" aufweist.
Null: "a" und "b" werden als gleich angesehen und es wird keine Sortierung durchgeführt.
Größer als 0: "b" ist so sortiert, dass es einen niedrigeren Index als "a" aufweist.

Wird die Array-Sortier-Rückruffunktion im Verlauf der Sortierung mehrmals aufgerufen?

Wenn ja, würde ich gerne wissen, welche zwei Zahlen jedes Mal an die Funktion übergeben werden. Ich nahm an, dass es zuerst "25" (a) und "8" (b) dauerte, gefolgt von "7" (a) und "41" (b), also:

25 (a) - 8 (b) = 17 (größer als Null, also sortiere "b", um einen niedrigeren Index als "a" zu haben): 8, 25

7 (a) - 41 (b) = -34 (kleiner als Null, also sortiere "a", um einen niedrigeren Index als "b" zu haben: 7, 41

Wie werden die beiden Zahlenreihen dann relativ zueinander sortiert?

Bitte helfen Sie einem kämpfenden Neuling!


5
Ich hoffe, das macht einen verstümmelten Sinn!
CW84

Antworten:


51

Wird die Array-Sortier-Rückruffunktion im Verlauf der Sortierung mehrmals aufgerufen?

Ja

Wenn ja, würde ich gerne wissen, welche zwei Zahlen jedes Mal an die Funktion übergeben werden

Sie könnten sich selbst herausfinden mit:

array.sort((a,b) => {
  console.log(`comparing ${a},${b}`);
  return a > b ? 1
               : a === b ? 0 
                         : -1;
});

BEARBEITEN

Dies ist die Ausgabe, die ich habe:

25,8
25,7
8,7
25,41

8
Führen Sie lieber ein console.log aus, um das .innerHTML + = "Vergleichen" + a + "," + b + "\ n" des firebug- oder HTML-DIV-Elements durchzuführen.
Joshua

2
Denken Sie daran, dass dies eine Wiki-ähnliche Seite ist und wir andere Antworten bearbeiten können, um sie besser zu machen :)
Pablo Fernandez

6
Nur ein Hinweis für die neue ES6-Syntax: array.sort((a,b) => a - b);ist eine gültige Syntax
Sterling Archer

1
Wenn die Sortierfunktion -ve zurückgibt, dann tauscht sie und + ve, dann tauscht sie nicht?
Mahi

2
@ShekharReddy Sie können immer noch Operatoren zum Vergleichen verwenden. Ich habe die Antwort aktualisiert.
OscarRyz

44

Der JavaScript-Interpreter verfügt über eine Art Sortieralgorithmus implementiert. Es ruft die Vergleichsfunktion einige Male während des Sortiervorgangs auf. Wie oft die Vergleichsfunktion aufgerufen wird, hängt vom jeweiligen Algorithmus, den zu sortierenden Daten und der Reihenfolge vor der Sortierung ab.

Einige Sortieralgorithmen weisen bei bereits sortierten Listen eine schlechte Leistung auf, da sie weitaus mehr Vergleiche anstellen als im typischen Fall. Andere kommen mit vorsortierten Listen gut zurecht, haben aber andere Fälle, in denen sie zu schlechten Leistungen "verleitet" werden können.

Es gibt viele häufig verwendete Sortieralgorithmen, da kein einzelner Algorithmus für alle Zwecke perfekt ist. Die beiden am häufigsten für die generische Sortierung verwendeten sind Quicksort und Merge Sort . Quicksort ist oft die schnellere von beiden, aber die Zusammenführungssortierung hat einige nette Eigenschaften, die es zu einer besseren Gesamtauswahl machen können. Die Zusammenführungssortierung ist stabil , Quicksort hingegen nicht. Beide Algorithmen sind parallelisierbar, aber die Funktionsweise der Zusammenführungssortierung macht eine parallele Implementierung effizienter, wenn alle anderen gleich sind.

Ihr spezieller JavaScript-Interpreter verwendet möglicherweise einen dieser Algorithmen oder etwas ganz anderes. Der ECMAScript- Standard legt nicht fest, welchen Algorithmus eine konforme Implementierung verwenden muss. Es wird sogar ausdrücklich das Bedürfnis nach Stabilität abgelehnt.


1
FWIW, Basic Quicksort ist einer der Algorithmen, die zu einer schlechten Leistung "ausgetrickst" werden können. In der einfachen Form hat es eine O (N ^ 2) -Leistung für Listen, die entweder bereits sortiert oder genau umgekehrt sind. Die meisten Quicksort-Algorithmen für Bibliotheken verfügen über eine Reihe nicht offensichtlicher Optimierungen, mit denen diese häufigen Worst-Case-Szenarien vermieden werden können.
Adisak

3
JavaScriptCore verwendet tatsächlich einen AVL-Baum zum Sortieren, da es erforderlich ist, sich gegenüber Komparatorfunktionen, die das zu sortierende Array ändern, deterministisch zu verhalten.
olliej

11

Wertepaare werden paarweise verglichen. Die verglichenen Paare sind ein Implementierungsdetail. Gehen Sie nicht davon aus, dass sie in jedem Browser gleich sind. Der Rückruf kann beliebig sein (Sie können also Zeichenfolgen oder römische Ziffern sortieren oder alles andere, wo Sie eine Funktion finden können, die 1,0, -1 zurückgibt).

Bei der Sortierung von JavaScript ist zu beachten, dass die Stabilität nicht garantiert werden kann.


5

Wird die Array-Sortier-Rückruffunktion im Verlauf der Sortierung mehrmals aufgerufen?

Ja, genau das ist es. Der Rückruf wird verwendet, um Elementpaare im Array nach Bedarf zu vergleichen, um zu bestimmen, in welcher Reihenfolge sie sein sollen. Diese Implementierung der Vergleichsfunktion ist beim Umgang mit einer numerischen Sortierung nicht untypisch. Details in der Spezifikation oder auf einigen anderen mehr lesbaren Seiten.


4

Wird die Array-Sortier-Rückruffunktion im Verlauf der Sortierung mehrmals aufgerufen?

Da es sich bei N Elementen um eine Vergleichssortierung handelt, sollte die Rückruffunktion für eine schnelle Sortierung wie Quicksort durchschnittlich (N * Lg N) Mal aufgerufen werden . Wenn der verwendete Algorithmus so etwas wie Bubble Sort ist , wird die Rückruffunktion durchschnittlich (N * N) Mal aufgerufen.

Die Mindestanzahl von Aufrufen für eine Vergleichssortierung beträgt (N-1). Dies dient nur zum Erkennen einer bereits sortierten Liste (dh zu einem frühen Zeitpunkt in der Blasensortierung, wenn keine Swaps auftreten).


2

Tiefes Wissen

Wenn das Ergebnis negativ ist, wird a vor b sortiert.

Wenn das Ergebnis positiv ist, wird b vor a sortiert.

Wenn das Ergebnis 0 ist, werden keine Änderungen an der Sortierreihenfolge der beiden Werte vorgenommen.

HINWEIS:

Dieser Code ist die Ansicht innerhalb des Sortierverfahren Schritt für Schritt.

AUSGABE:

let arr = [90, 1, 20, 14, 3, 55];
var sortRes = [];
var copy = arr.slice();		//create duplicate array
var inc = 0;	//inc meant increment
copy.sort((a, b) => {
	sortRes[inc] = [ a, b, a-b ];
	inc += 1;
	return a - b;
});
var p = 0;
for (var i = 0; i < inc; i++) {
	copy = arr.slice();
	copy.sort((a, b) => {
		p += 1;
		if (p <= i ) {
			return a - b;
		}
		else{
			return false;
		}
	});
	p = 0;
	console.log(copy +' \t a: '+ sortRes[i][0] +' \tb: '+ sortRes[i][1] +'\tTotal: '+ sortRes[i][2]);
}


0

Führen Sie diesen Code aus. Sie können den genauen Sortiervorgang Schritt für Schritt vom Anfang bis zum Ende sehen.

var array=[25, 8, 7, 41]
var count = 1;
array.sort( (a,b) => { 
console.log(`${count++}). a: ${a} | b: ${b}`);
return a-b;
});
console.log(array);

kopiert und in die Konsole eingefügt und nur undefiniert zurückgegeben.
iPzard

-2
var array=[25, 8, 7, 41]

array.sort(function(a,b){
  console.log(`a = ${a} , b = ${b}`);
  return a - b
});

AUSGABE

  • a = 8, b = 25
  • a = 7, b = 8
  • a = 41, b = 7
  • a = 41, b = 8
  • a = 41, b = 25

In meinem Browser (Google Chrome Version 70.0.3538.77 (Official Build) (64-Bit)) in der ersten Iteration ist das Argument a das zweite Element in einem Array und das Argument b das erste Element eines Arrays.

wenn die Vergleichsfunktion zurückkehrt

  1. Ein negativer Wert als b wird vorwärts zu a verschoben.
  2. positiver Wert als a wird vorwärts zu b verschoben.
  3. 0 (Null) beide a & b bleiben wie sie sind.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.