Sven Rautenberg: Mehrdimensionales Array sortieren -- kompliziert

Beitrag lesen

Moin!

Als Anregung zum selberdenken:

Du willst $arr sortieren. Du brauchst eine benutzerdefinierte Vergleichfunktion, welche die einzelnen Elemente von $arr vergleicht.

Diese Vergleichsfunktion erhält jeweils zwei Elemente aus $arr.

Aber ich hab doch mehr als zwei Elemente. Sogar beliebig viele. Irgendwie komm ich nicht ganz darauf, was ich machen müsste.

Sortieren ist ein beständiges Vergleichen und ggf. vertauschen von zwei Elementen aus dem Array.

Es gibt verschiedene Algorithmen, die unterschiedlich schnell sind, weil sie je nach Ansatz mehr oder weniger Vergleiche und Vertauschungen haben. Aber alle benötigen die Information, ob das eine Vergleichselement kleiner als das andere ist oder nicht.

Nehmen wir mal Bubblesort als Algorithmustyp. Diese Art des Sortierens ist die langsamste, aber am verständlichsten für Anfänger:

Angenommen, du hast 5 Elemente in deinem Array. Nehmen wir Integer-Zahlen:
 8   4   9   1   4

Bubblesort vergleicht zuerst das erste Element nacheinenander mit dem zweiten, dritten, vierten und fünften, und wenn das hintere Element kleiner ist, als das vordere Element, werden beide getauscht. Ich mach mal klammern um die jeweils verglichenen Elemente und kommentiere:

(8) (4)  9   1   4   // 4 ist kleiner als 8, aber hinten, also tauschen.
(4)  8  (9)  1   4   // 9 ist größer, also nicht tauschen
(4)  8   9  (1)  4   // 1 ist kleiner und hinten, also tauschen
(1)  8   9   4  (4)  // 4 ist größer als 1, also nicht tauschen.

Am Ende dieses Durchlaufs steht das kleinste Element ganz vorne, und dahinter unsortiert nur Elemente, die größer sind.

Also wird jetzt mit den Array-Elementen 2 bis 5 nochmal sortiert. Das drösel ich jetzt nicht ganz bis zum Ende auf. :)

Du siehst hoffentlich: Damit der Algorighmus weiß, ob er tauschen muß, werden jeweils zwei Elemente des Arrays wertmäßig verglichen.

Und genau diesen Vergleich kannst du bei der Funktion usort() manuell in einer Funktion bestimmen.

Und die Beschreibung für usort() enthält als Beispiel 2 genau deinen Fall.

- Sven Rautenberg