Das was DeddyH schreibt ist schon mal die Lösung für dein Problem!
Wenn du später mal eine Reihe von Zahlen, unbekannter Anzahl, oder generell irgendwelche Sachen Sortieren möchtest, dann kann man diesen oben genannten Lösungsansatz noch vertiefen!
Dazu gibt es 2 Punkte die man im Hinterkopf haben sollte:
- Sortiert wird durch einfaches Tauschen von Positionen
- Sachen die Sortiert werden können unterschiedlich viel Speicher verbrauchen, wo durch ein tauschen der Werte große Rechenbelastung bedeuten kann!
Durch diese Punkte kommt man schnell zu dem Ergebnis, dass das Tauschen der Werte nicht immer die güstigste Lösung ist, daher ist es Ratsam die Position zwar zu tauschen, aber nicht die Werte! Sowas erreicht man z.B. indem man nur die Adressen (Pointer) zu den Werten (4 Byte) in einer Liste sortiert und nicht die Werte selbst, welche mit unter auch mal unterschiedlich groß sein können und auch mal ungeante Größen haben könenn (z.B. 100MB).
Damit hätte man schon sehr viel Speichermanagement weniger! Und ein weiterer Vorteil, es ist universel nutzbar!
Universel nutzbar? Ja! Das ganze hört sich jetzt ev. bischen schwer an, im Grunde ist es aber ganz einfach!
1. Man nehme eine Liste von Werten und indiziere sie.
Delphi-Quellcode:
Var MyValues: Array Of Irgendwas; // Die Werte
MySortValues: Array Of Pointer; // Indizierung der Werte
// ** Werte Indizieren
SetLength( MySortValues, Length( MyValues ) );
For i := 0 To Length( MyValues ) - 1 Do Begin
MySortValues[ i ] := @MyValues[ i ];
End;
2. Man benötigt eine Funktion die die Werte untereinander vergleicht, sozusagen eine Relation aufbaut.
Diese Funktion definieren wir uns erstmal gleich als Typ.
Delphi-Quellcode:
Type
TRelationFunction = Function( Const Value1, Value2: Pointer ): Integer; // <0 = Kleiner, 0 = Gleich, >0 = Größer
eine Funktion um Integer zu vergleichen könnte passend zum definierten Typ so aussehen:
Delphi-Quellcode:
Function IntegerRelation( Const Value1, Value2: Pointer ): Integer;
Begin
// <0 = Kleiner, 0 = Gleich, >0 = Größer
Result := Integer( Value1^ ) - Integer( Value2^ );
End;
3. Man benötigt eine allgemeine Funktion zum sortieren, diese könnte so definiert sein:
Delphi-Quellcode:
Type
TSortFunction = Procedure( Var ToSort: Array Of Pointer; Const RelationFunction: TRelationFunction );
Eine Implementation wäre dann so eine:
Delphi-Quellcode:
Procedure SimpleBubblesort( Var ToSort: Array Of Pointer; Const RelationFunction: TRelationFunction );
Var Len: Integer;
i: Integer;
aChange: Boolean;
Temp: Pointer;
Begin
Len := Length( ToSort );
If Len > 1 Then Begin
Repeat
aChange := False;
For i := 0 To Length( ToSort ) - 2 Do Begin
If RelationFunction( ToSort[ i ], ToSort[ i + 1 ] ) > 0 Then Begin
Temp := ToSort[ i ];
ToSort[ i ] := ToSort[ i + 1 ];
ToSort[ i + 1 ] := Temp;
aChange := True;
End;
End;
Until Not aChange;
End;
End;
Nun kann man viele verschiedene Sortierungen programmieren (TSortFunction's) und mithilfe neuer Relationsmodelle (TRelationFunction's) diese dann ohne wilde Programierung auf verschiedene Typen (Integer, Strings oder Eigene Objecte) verwenden lassen.
Natürlich muss man das
Rad nicht neu erfinden, Delphi bietet schon verschiedene Sortierungsfunktionen an, es lohnt sich mal die Function Sort von der Klasse TList (
Unit Classes) anzuschauen.
Bye Christian
Edit: Habe mal so eine kleine Konsolen-Anwendung als Beispiel dreingepackt... (nicht schimpfen, ich bin kein Konsolen-Programierer, geht sicher schöner, erfüllt aber seinen Zweck...)
So, damit solltest du alles haben um deine Hausaufgaben meisten zu können...