Autor Beitrag
Scharfrichter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Di 07.02.06 18:33 
Hi,

ich darf bald eine 12-Seitige Facharbeit für Informatik an meinen Fachlehrer abliefern, wobei bald relativ ist, ich hab glaube ich noch so um die 4 Wochen, aber egal. Das Rahmenthema meiner Facharbeit ist wie ihr euch bestimmt denken könnt das Sortierverfahren Heapsort und ich soll zusätzlich zu dem theoretisch/schriftlichen Teil noch ein kleines Programm basteln was den Alogrithmus veranschaulicht und seine funktionsweise erklärt. Jetzt wusste ich aus dem Unterricht nur was ein Heap ist und wie diese aufgebaut ist und den Algorithmus soll ich selber verfassen. Jetzt hab ich mir in den letzten Tagen x-Seiten von literatur aus nem Buch und ausm Netz zu dem Thema reingezogen und hab gestern ne kleine Testumgebung gebaut und versucht den Algorithmus selbst zu proggen, hat eigentlich auch fast alles perfekt geklappt, nur dieses "fast" steht mir im Wege. Hier erstmal der code fürs Versickern und für den Heapsort selber:
ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
Procedure TSSBaum.Versickern(knot,niveau: integer);
var tempknot,subknot: integer;
Begin
  tempknot := self.Value(knot);
  While knot < round(niveau / 2do
    Begin
      subknot := 2*knot;
      If (subknot <= N -1and (self.Value(subknot) < self.Value(subknot+1)) then
        Inc(subknot);
      If tempknot >= self.Value(subknot) then
        break
      else
        self.Note(knot,self.Value(subknot));
      knot := subknot;
    end;
  self.Note(knot,tempknot);
end;

Procedure TSSBaum.Heapsort();
var
  knot, temp, i, t,m : integer;
begin
  i := N;
  knot := i div 2;
  For t :=  (n div 2downto 1 do
    versickern(t,i);
   For m:= N downto 1 do
    Begin
      temp := self.value(1);
      self.Note(1,self.value(m));
      self.Note(m,temp);
      versickern(1, m-1);
    end;
end;


Erklärung: Also mein Heapsort greift auf ein Array als abgeleitetes Objekt einer anderen Unit zu, deswegen kann ich das Array an sich nur über festgelegte Befehle die mir mein Lehrer vorgegeben hat ansteuern, dass sind: Empty, Value(K: integer):integer und note(k,b: integer); Empty überprüft ob, dass Array leer ist, value gibt für die den index k den jeweiligen integer wert des array-items zurück und note schreibt auf den index k den wert b. Jetzt hab ich dazu ne Testumgebung gebastelt die erstmal nur über ein festes 31iger Array verfügt was in der Heapunit festgelegt ist. Das Array wird Anfangs mit zufälligen Zahlen voll gestopft und soll dann über den Aufruf von Heapsort; geordnet werden. Das Ganze klappt auch wunderbar, nur so ca. bei jedem 3ten oder 4ten zufällig erzeugten Array sind die letzten beiden(also die kleinsten) Werte im Array nicht richtig sortiert wurden, da steht dann mal ne 3 vor na 9 oder ne 2 vor na 8(Der größte Index 31 beherbergt den größten Wert und den kleinste Index 1 den niedrigsten Wert). Ich hab keine Ahnung warum das Heapsort mal perfekt klappt und alles wunderbar geordnet ist und mal die kleinsten Werte nicht richtig sortiert sind.
Wenn es geklappt haben sollte, ist anbei die .exe zur Testumgebung. Einfach im Menü oben auf Belegung->Zufällig und dann unter Funktionen-> Heapsort, dann sollte links im Label der Array angezeigt werden, mal mehr mal weniger geordnet.
Ich hoffe ihr könnt mir sagen was für einen Fehler ich mache.

Moderiert von user profile iconGausi: Quote- durch Delphi-Tags ersetzt
Moderiert von user profile iconMotzi: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 07.02.2006 um 19:21
Einloggen, um Attachments anzusehen!
inselberg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 458



BeitragVerfasst: Mi 08.02.06 02:19 
poste einfach mal ein zahlenbeispiel wo es nicht sortiert wird.

so beim "draufschauen" fällt mir nur auf dass du immer nur bis 1 läufst (array [1..max] ?) oder ist das schon der fehler

_________________
hans bist du das ?
Scharfrichter Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mi 08.02.06 11:17 
Ne das ist schon korrekt, weil der erste index ist halt 1 und net 0 bei dem array und wenn ich die untergrenze bis auf 0 stelle, wandelt der ein oder zwei integer werte in 0 um, weil der die irgendwie überschreibt oder so, auf jeden fall da liegt nicht der fehler..
Also beim Zahlenbeispiel kann ich jetzt nichts konkretes angeben, interessant ist nur, dass bei jedem ersten zufällig erzeugten array gebilde der fehler auftritt, komischer weise ist dass auch immer der gleiceh array, also es werden imemr die gleichen zahlen erzeugt, keine ahnung warum..
ich hab einfach mal die zwei entsprechenden units angefügt, die unit SBaum ist die vorgabe von meinem lehrer, da ist dann das feste 31-Array verankert so dass man nur mit den entsprechend eingebauten befehlen der unit selber zugreifen kein und nicht direkt das array ansteuern kann. die unit ssbaum ist davon abgeleitet und die wird mit weitergehenden prozeduren und funktionen ausgebaut, um unter anderm halt das heapsort zu realisieren.
Einloggen, um Attachments anzusehen!
inselberg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 458



BeitragVerfasst: Mi 08.02.06 11:28 
Zitat:
also es werden imemr die gleichen zahlen erzeugt, keine ahnung warum..

randomize

_________________
hans bist du das ?
Scharfrichter Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mi 08.02.06 13:03 
wenn du dir die unit ssbaum anguckst, wirst du sehen das ichb in der prozedur zufaelligbelegen das array mit randomize fülle, es war zwar bis jetzt kein problem aber ich wunder mich halt warum einige kombinationen des öfteren sich wiederholen, ob wohl es ja eine zufalls generierung seien sollte, aber das ist ja eigentlich nicht das problem, ich weiß immer noch nicht warum mein heapsort nur zu 99% arbeitet...
inselberg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 458



BeitragVerfasst: Mi 08.02.06 17:03 
ausblenden Quelltext
1:
While ( knot < round(niveau / 2) ) do					

ist das problem... beim letzten element wird es mit versickern(1, 1); aufgerufen wodurch nicht mehr getauscht wird - ich schaus mir mal später genauer an.

mir leuchtet auch nicht ein wieso du zusätzlich "niveau" benutzt, "knot" zeigt dir doch schon wo du dich befindest.

_________________
hans bist du das ?
Scharfrichter Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Mi 08.02.06 18:24 
mhh leuchtet mir ein das mit dem letzten aufruf, nur frage ich mich dann warum der in 3 von 4 fällen sag ich mal ne korrekte sortierung vornimmt und in dem 4ten falle nicht. in wie fern sollte ich denn die stelle ändern, damit er die letzte vertauschung vorgenommen wird
inselberg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 458



BeitragVerfasst: Do 09.02.06 04:00 
lass es dir einfach mal die heapstruktur ausgeben, dann siehst du dass es vorkommt wenn der letzte zu sortierende wert (der 2. im feld) grösser ist als der letzte.
bei einer richtigen versickerung würde dieser ja entdeckt und getauscht werden.

wenn ich gleich lust hab änder ich mal deine versickerung um

_________________
hans bist du das ?
Scharfrichter Threadstarter
Hält's aus hier
Beiträge: 15



BeitragVerfasst: Fr 10.02.06 17:15 
wäre super wenn du nochmal nen blick drüber werfen könntest, ich hab mir das gestern den halben tag angeguckt und experementiert was das zeug hält, aber eine verbesserung hat sich nicht ergeben