Entwickler-Ecke

Algorithmen, Optimierung und Assembler - problem mit InsertionSort


mick - Sa 08.04.06 23:25
Titel: problem mit InsertionSort
ich bin doch tatsaechlich nicht in der lage den fehler in folgendem pascal-code (hoffentlich stellt das jetzt kein problem dar) zu finden.
zwei insertionsort-implementierungen sind da zur wahl, beide machen die gleichen mucken: die fuehrende zahl im array wird nicht wegsortiert. warum? liegt der fehler im testhauptprogramm oder in der prozedur oder was?


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:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
program MiJoZi_Test;
uses crt;
var
  i,j : integer;
  feld: array[1..10of longint;

{ ************************************************************************** }

{ Uebergabe: Zu sortierendes Feld, das an den Stellen 1 bis n mit natuerlichen Zahlen belegt ist }

(* FEHLERHAFT!!! SORTIERT ERSTES ELEMENT NICHT WEG, BZW. VORNE BLEIBT EINE ZAHL STEHEN,
   DIE DORT NICHT HINGEHOERT!!! *)


Procedure InsertionSort(Var Feld: Array Of LongInt);
Var
  i, j: LongInt;  { Zaehlvariablen }
  Temp: LongInt;  { Zwischenspeicher }
Begin
  For i := 2 To High(Feld) Do Begin  { High liefert (Nummer vom) hoechsten Feldindex }
    Temp := Feld[i];
    j := i - 1;
    While (Feld[j] > Temp) And (j > 0Do Begin
      Feld[j+1] := Feld[j];
      j := j - 1;
    End;
    Feld[j+1] := Temp;
  End;
End;

(* Alternativ (funktioniert auch nicht mit dem untigem Test-Hauptprogramm):
Procedure InsertionSort(Var Feld: Array Of LongInt);
Var
  i, j: LongInt;  { Zaehlvariablen }
  Temp: LongInt;  { Zwischenspeicher }
Begin
  For i := 2 To High(Feld) Do Begin  { High liefert (Nummer vom) hoechsten Feldindex }
    Temp := Feld[i];
    j := i;
    While (Feld[j-1] > Temp) And (j <> 1) Do Begin
      Feld[j] := Feld[j-1];
      j := j - 1;
    End;
    Feld[j] := Temp;
  End;
End; *)


{ ************************************************************************** }


begin
  clrscr;
  randomize;
  for i := 1 to 5 do begin  { 5 Testdurchlaeufe }
    for j := 1 to 10 do feld[j] := random(10);  { Fuellen mit Ziffern 0 bis 9 }
    write (i:2,') Unsortiert: ');  { Unsortiert ausgeben }
    for j := 1 to 10 do write (' ',feld[j]);
    writeln;
    Insertionsort(feld);  { Sortieren }
    write ('    Sortiert  : ');  { Sortiert ausgeben }
    for j := 1 to 10 do write (' ',feld[j]);
    writeln; writeln;
  end;
  writeln;
  readln;
end.


ciao,
mick.


AXMD - Sa 08.04.06 23:27

Zeile 19: warum fängst du bei i = 2 an zu zählen? Dynamische Arrays beginnen immer mit dem Index 0, wenn sie an eine Prozedur übergeben werden.

AXMD


mick - Sa 08.04.06 23:33

danke. sollte es dann i := 1 heissen? das klappt bei mir auch nicht.

ciao,
mick.


AXMD - Sa 08.04.06 23:38

Kannst du "klappt nicht" vielleicht etwas genauer beschreiben :roll: ? Außerdem würde ich dich bitten, das "bloed oder was?!" aus dem Titel zu entfernen.

Danke
AXMD


mick - Sa 08.04.06 23:44

klappt nicht bedeutet, dass ich nach wie vor dasselbe problem habe: die vorderste zahl wird nicht wegsortiert.

eine moeglichkeit waere jedoch folgende modifiktion, wie ich grade sehe:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
{...}
For i := 1 To High(Feld) Do Begin  { High liefert (Nummer vom) hoechsten Feldindex }
    Temp := Feld[i];
    j := i - 1;
    While (Feld[j] > Temp) And (j > -1Do Begin
{...}


das muesste jetzt "klappen".
weiss nur noch nicht, was das alles mit dynamischen arrays zu tun hat. die gibt es doch noch nicht bei pascal, oder? wie kann mein compiler hier dann (und: wo?) dynamische arrays akzeptieren?

ciao,
mick.


ps: titel editiert. (hui, seid ihr restriktiv.)


AXMD - Sa 08.04.06 23:46

user profile iconmick hat folgendes geschrieben:
weiss nur noch nicht, was das alles mit dynamischen arrays zu tun hat. die gibt es doch noch nicht bei pascal, oder? wie kann mein compiler hier dann (und: wo?) dynamische arrays akzeptieren?


Was ist dann das Array in Zeile 14 :gruebel:? Sieht nicht sehr statisch aus...

AXMD


mick - Sa 08.04.06 23:57

hm, ok, wenn das auch unter die kategorie dynamische arrays faellt, ok. ich glaube ich muss da mal ein paar luecken schliessen. hatte in erinnerung, dass turbopascal dyn. arrays nicht kennt und es sich hier um eine "gewoehnliche" variablenuebergabe an ein unterprogramm handelt (wie sollte ich die auch anders (nicht dynamisch) gestalten, die array-uebergabe?).

jedenfalls funzt nun das programm. auch wenn dies nicht mehr vielen abgedrucken idealloesungen in skripten etc. entspricht (die erste in meinem ersten posting ist eine). wollte im grunde naemlich wissen, warum ich diese loesungen nicht 1:1 kopieren kann. du sagst wg. dyn. arrays. das scheint zu stimmen, aber ich verstehe es nicht.

danke fuer die programmiertechnische aufklaerung,

ciao,
mick.