Einzelnen Beitrag anzeigen

Benutzerbild von Kedariodakon
Kedariodakon

Registriert seit: 10. Sep 2004
Ort: Mönchengladbach
833 Beiträge
 
Delphi 7 Enterprise
 
#15

Re: Sortieren von zahlen-aber wie?

  Alt 5. Okt 2007, 23:07
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...
Angehängte Dateien
Dateityp: dpr sortmydigits_152.dpr (4,7 KB, 9x aufgerufen)
Christian
  Mit Zitat antworten Zitat