Die Zeilen einer Matrix sortieren

 

Die folgenden Aufgaben haben alle zum Inhalt, die Zeilen einer Matrix zu sortieren. Das Sortierverfahren, das dabei zum Einsatz kommen soll, ist „Sortieren durch Auswahl“ (Selection Sort). Die gewünschte Sortierrichtung ist bei allen Aufgaben „aufsteigend“. Der kleinste Wert steht also nach der Sortierung immer am Anfang bzw. in der ersten Zeile. Außerdem wollen wir verlangen, dass keine der zu schreibenden Sortierfunktionen Nebeneffekte haben soll.

 

 

 

Sortieren nach einem einzigen Kriterium (nach einer einzigen Spalte)

 

Bei den ersten beiden Aufgaben geht es darum, die Zeilen einer Matrix nach den Werten in einer der Spalten der Matrix zu sortieren. Ein kleines Beispiel soll zeigen, was damit gemeint ist. Im folgenden Bild ist links die zu sortierende Originalmatrix zu sehen. Wir wollen annehmen, dass die Zeilen dieser Matrix nach den Werten in Spalte 3 sortiert werden sollen. Auf der rechten Seite des Bilds sieht man das Ergebnis dieser Sortierung. Die Zeile, welche in der dritten Spalte den kleinsten Wert aufweist, steht ganz oben, die Zeile mit dem größten Wert ganz unten.

 

 

 

Aufgabe 1:   Allgemein anwendbare Sortierfunktion (nicht UDF)

 

Schreiben Sie eine Funktion mit der Kopfzeile

 

Public Function matrSort (ByRef m() As Double, ByVal c As Integer) As Double()

 

die eine Matrix liefert, welche der nach den Werten in Spalte c sortierten Matrix m entspricht. Das benutzte Sortierverfahren soll „Sortieren durch Auswählen“ sein.

 

 

 

Aufgabe 2:   Benutzerdefinierte Sortierfunktion (UDF)

 

Schreiben Sie eine Funktion mit der Kopfzeile

 

Public Function matrSortUDF (ByVal r As Range, ByVal c As Integer) As Double()

 

die eine Matrix liefert, welche der nach den Werten in Spalte c sortierten Matrix entspricht, die sich im Bereich r der Arbeitsmappe befindet.

 

Wenden Sie bei der Programmierung die Technik des Einwickelns (s. Skript Aufbaukurs, „ Mächtige benutzerdefinierte Funktionen“) an, so dass Sie die vorher programmierte Funktion aus Aufgabe 1 weiter verwenden können.

 

 

 

Sortieren nach mehreren Kriterien (nach mehreren Spalten)

 

Für die Aufgaben 3 und 4 gilt eine etwas veränderte Aufgabenstellung. Hier soll nicht nur nach einer Spalte, sondern nach beliebig vielen Spalten sortiert werden. Auch hier vermittelt ein Beispiel am besten, was gemeint ist. Im folgenden Bild ist wieder auf der linken Seite die Originalmatrix abgebildet, rechts die sortierte Matrix, die (wie die Überschrift besagt), nach den Spalten 1, 2 und 3 sortiert ist.

 

 

Die Reihenfolge der Spalten drückt aus, dass bei dieser Sortierung Spalte 1 als primäres Sortierkriterium fungiert, Spalte 2 als sekundäres und Spalte 3 als tertiäres. Ein Blick auf die Tabelle zeigt uns, was dies bedeutet:

 

  • Die Zeilen sind nach den Werten in Spalte 1 sortiert. Die Zeile mit dem kleinsten Wert in Spalte 1, erscheint ganz oben in der Tabelle, eine der Zeilen mit dem höchsten Wert ganz unten.
  • Innerhalb gleicher Werte von Spalte 1 sind die Zeilen nach den Werten von Spalte 2 sortiert.
  • Innerhalb gleicher Werte von Spalte 2 sind sie nach den Werten von Spalte 3 sortiert.

 

Eine andere Reihenfolge der Sortierkriterien bzw. Sortierspalten führt gewöhnlich auch zu einem anderen Sortierergebnis. Das folgende Bild demonstriert dies am Beispiel einer Sortierung nach den Spalten 3, 2 und 1:

 

 

Die übrigen Rahmenbedingungen sollen für die Aufgaben 3 und 4 dieselben sein wie für die Aufgaben 1 und 2. Also: angewandte Sortiermethode ist Sortieren durch Auswahl, und die Sortierfunktion soll keinerlei Nebeneffekte haben.

 

 

Aufgabe 3: Sortieren nach mehreren Spalten, allgemein anwendbare Funktion (keine UDF)

 

Schreiben Sie eine Funktion mit der Kopfzeile

 

Public Function matrSort2 (ByRef m() As Double, ByRef c() As Integer) As Double()

 

die eine Matrix liefert, welche nach den Spalten sortiert ist, deren Nummern im Array c aufgelistet sind.

 

Die Reihenfolge der in c enthaltenen Spaltennummern ist wichtig. Sie bestimmt, welche Spalte primäres Sortierkriterium ist, welche sekundäres, usw. Normalerweise wird c nicht mehr Spalten enthalten als die Matrix m.

 

 

 

Aufgabe 4: Sortieren nach mehreren Spalten, benutzerdefinierte Funktion (UDF)

 

Schreiben Sie eine Funktion mit der Kopfzeile

 

Public Function matrSort2UDF (ByRef r As Range, ParamArray cols() As Variant) As Double()

 

die eine Matrix liefert, welche nach den Spalten sortiert ist, deren Nummern im Array cols aufgelistet sind.

 

Wenden Sie auch hier bei der Programmierung die Technik des Einwickelns  an, so dass Sie die vorher programmierte Funktion aus Aufgabe 3 weiter verwenden können. Wie man mit Parametern der Art ParamArray umgeht, können Sie in dem bereits oben erwähnten Skript Aufbaukurs, „Mächtige benutzerdefinierte Funktionen“, nachlesen.