Thema: Delphi Arrays sortieren

Einzelnen Beitrag anzeigen

Der_Unwissende

Registriert seit: 13. Dez 2003
Ort: Berlin
1.756 Beiträge
 
#7

Re: Arrays sortieren

  Alt 7. Okt 2005, 10:16
Hi,
also erstmal vorweg, wenn du eine Nachricht schreibst, dann hast du über diesem Edit-Feld in das du den Text tippst noch ein paar Button (B, i, U, Zitat, Delphi-Code,...) und nun ja, Delphi-Code leitet einen Delphi-Code Teil ein. Wenn du deinen Quelltext eingefügt hast, dann beendest du den mit dem selben Knopf (hat dann ein * vor).
Ansonsten noch als Tip, schau dir die Einrückungen an, die gemacht wurden sind. Das macht Code immer sehr viel leichter lesbar und damit auch immer besser verständlich. Wirst du sicher auch schnell merken, ansonsten findest du sicher auch hier viel zum Thema guten Programmierstil (nicht als Kritik verstehen!, nur du stehst offensichtlich noch am Anfang und das ist der perfekte Zeitpunkt sich mit Programmierstil zu beschäftigen. Hab da Sachen von Leuten die für schlappe 40€/Std arbeiten gesehen, egal)

Ja, zu

Zitat:
Im Struktogramm war angegeben:

Quellcode: markieren
Für i = bis Anzahl -1
Für j= i + 1 bis Anzahl
Wert: [i] > Wert j
wenn true dann:
tausche Wert [i] mit Wert [j]

wenn false dann zum Programm
Das ist ein sehr einfacher Bubblesort. Da findest du auch schon ne Menge im Netz zu. Die einfache Idee hinter diesem Algorithmus ist auch der Namensgeber. Stell dir einfach mal vor, deine Werte die du sortieren möchtest sind in Blasen, dein Array ist eine Flüssigkeit. Dann sortierst du so, dass die leichtesten Blasen schnell aufsteigen, die ganz schweren unten bleiben (ok, kann man sicher schöner erklären).

Konkret im Struktogramm/Programm machst du dazu nichts anderes als paarweise zu sortieren. Der Einfachheit halber erklär ich es dir mal an einem Array mit 4 Elementen (Werte : Array[0..3] of Integer). Legen wir noch fest, dass aufsteigend sortiert wird.
Dann vergleichst du jetzt Werte[0] mit Werte[1], wenn Werte[0] > Werte[1], dann tauscht du die beiden. Wenn nicht, machst du einfach nichts. Dann guckst du dir Werte[1] und Werte[2] an und machst das gleiche, dann Werte[2] und Werte[3], dann bist du jetzt alle 4 Werte durchgegangen.
Was jetzt sicher ist, ist dass die leichtest Blase / die größte Zahl aus Werte ganz rechts (also richtig) steht. Das ist die innere Schleife (das mit dem j). Jetzt bleiben aber noch die anderen Werte, also zweitgrößte bis kleinste. Hier musst du also wieder das gleiche tun, also ganz rechts anfangen und immer wieder tauschen. Für dieses innere Tauschen brauchst du immer so viele Schritte wie du Elemente im Array hast (ok, - 1) um alle Paare verglichen zu haben. Für die äussere wäre jetzt die Überlegung, wie oft musst du maximal tauschen, wenn du die schlechteste vorsortierung hast? Für diese Art des Sortierens ist der Worst-Case eindeutig ein falschrum sortiertes Array (schau dir das mal auf Papier an, mit den Array[4,3,2,1] oder so). Hier müsstest du also auch 3 mal (länge Array - 1) die äussere Schleife durchlaufen.

Es gibt dabei noch ein paar Dinge, die man optimieren kann. Wie gesagt beim ersten aufsteigenden Sortieren ist schon mal der größte Wert ganz links. Das heißt für's nächste Sortieren brauchst du den letzten Wert nicht mehr anschauen, der ist schon richtig sortiert! Nach dem zweiten Durchlauf, sind die letzten beiden sortiert...
Dass heißt, abhängig von dem äusseren i kannst du dein inneres j beschränken, da der hintere Teil beim aufsteigenden Sortieren schon richtig ist.
Jetzt kann es noch sein, dass du nicht den Worst-Case hast und du nicht (Länge des Arrays - 1) mal tauschen musst. Dann bist du jetzt schon nach n-Schritten fertig. Doch woher weißt du dass? Ganz einfach, wenn alles sortiert ist, dann brauchst du gar nichts tauschen. Also merkst du dir ob du in der innere Schleife getauscht hast oder nicht. In der äusseren guckst du nun ob getauscht wurde, wenn nicht, dann bist du schon fertig mit dem sortieren und brichst das weitere Sortieren ab. Sonst machst du ganz einfach
weiter!

Hoffe auch das ich das Struktogramm soweit richtig verstanden habe, denn es fehlt der Wert bei dem i startet. Zudem musst du bei Arrays immer aufpassen, wie der Index läuft. Wenn die bei 0 anfangen, dann laufen die auch nur bis Index (Anzahl - 1), wenn die bei 1 anfangen dann natürlich bis Anzahl. Schau dir da am besten mal High(<Array>) und Low(<Array>) an


Ok, jetzt noch eine Kleinigkeiten, einerseits hoffe ich du verstehst schon mal grob wie das alles funktioniert. Was Code posten angeht, halte ich mich mal zurück, versuch einfach mal was und poste es, hier wird dir dann geholfen. Und auch wenn du alles fertig bekommst (also im Netz), ist nicht das selbe! Man fühlt sich einfach gut wenn man Probleme löst (und mit solchen haben hier sicher die meisten mal angefangen).
  Mit Zitat antworten Zitat