Thema: Delphi Array sortieren

Einzelnen Beitrag anzeigen

Der_Unwissende

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

Re: Array sortieren

  Alt 5. Mär 2006, 17:42
Dein Vergleich ist folgender
Delphi-Quellcode:
 For x:=y to (Anzahl-1) do
        begin
          if MyAdress[x].Name < MyAdress[x+1] then
           ....
Du läufst also von links nach rechts. Dein Y wird dabei in jedem Durchlauf größer (und da du von y bis Anzahl - 1 läufst, verschiebst du damit den linken Startindex, das meinte ich als linke Grenze).
Ok, was machst du nun? Du vergleichst das Element an der Stelle x mit dem an x+1. Das heißt, die Elemente die du vergleichst sind immer benachbart.
Hättest du [2,3,7,1] dann würdest du folgende Vergleiche haben: (2,3), (3,7), (7,1). Jetzt das gleiche, mit dem Tauschen wenn der Nachbar (x+1) < x
(2,3) nichts tun
(3,7) nichts tun
(7,1) tauschen
-> [2,3,1,7]
Also ist das größte Element nun an seiner richtigen Stelle. Über das kleinste Element kannst du aber nicht viel sagen. Du gehst aber (fälschlich) davon aus, dass das kleinste Element an der linkesten Stelle steht und betrachtest nur noch den unsortierten Teil, hier also [3,1,7]. Es kann also nicht mehr zu einem korrekten Ergebnis kommen (die 1 wird nie mit der 2 verglichen).

Es gibt halt zwei Ansätze, der eine sieht so aus, wie dass was du schon gesagt hast. Du merkst dir das wirklich kleinte Element und den Index von diesem Element. Dann musst du aber auch alle Elemente mit genau diesem für den Durchlauf kleinsten Element vergleichen und ggf. tauschen. Dann kannst du natürlich davon ausgehen, dass du die linkesten Elemente schon sortiert hast (das entspricht dem Sortieren durch einfügen / Insertionsort).

Der andere Weg wäre, dass du halt immer paarweise mit dem Nachbarn vergleichst und tauscht. Wichtig, du musst natürlich auch direkt tauschen (nur ein if und in dem direkt tauschen). Sind die Nachbarn richtig sortiert, musst du halt nichts machen. Damit hast du im ersten Durchlauf garantiert das größte Element ganz rechts stehen. Das heißt, du musst deine Grenze x von 0 bis (Anzahl - 1) - y laufen lassen. Das wäre dann der Bubble-Sort, da die großen Werte wie Blasen aufsteigen.

Beide brauchen gleich lang (asymptotisch gesehen, ohne Optimierungen). Es ist eine obere Grenze für's Sortieren, wenn du Anzahl * Anzahl Schritte brauchst. Alles was darüber hinaus geht, macht ordentlich was falsch. Der ziemlich intuitivste Weg (das wäre dann der Insertionsort) braucht halt schon "nur" so lange. Aber das ist alles Theorie, die für dich erst wichtig wird, wenn du eine wirklich große Anzahl von Elementen in möglichst kurzer Zeit sortieren musst.

In deinem Code liegt der Fehler also wahrscheinlich nur im Paarweisen vergleich der Nachbarn. Dein Minimum kann damit nur aus dem letzten Paar stammen.
  Mit Zitat antworten Zitat