AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Sortieren von zahlen-aber wie?

Offene Frage von "Maja"
Ein Thema von Maja · begonnen am 5. Okt 2007 · letzter Beitrag vom 9. Okt 2007
Antwort Antwort
Benutzerbild von Kedariodakon
Kedariodakon

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

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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:27 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz