Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Sortieren mit Einfügen


Anika - So 06.01.13 15:22
Titel: Sortieren mit Einfügen
Guten Tag,
in Informatik haben wir die Hausuafgabe bekommen 50 Zahlen mit Sortieren mit Einfügen zu sortieren.
Ich denke, das ich es verstanden habe aber meine Lösung sortiert nicht richtig. Einige Zahlen sind weg, andere kommen mehrfach.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
const n = 50;
var x : array [0..n] of integer;

procedure TForm1.Sort(Sender: TObject);
var h,i,j : integer;
begin
  for i:=2 to n do begin
     h:=x[i];
     j:=i-1;
     while (j>0and (h<x[j]) do
     begin
       x[j+1]:=x[j];
       j:=j-1;
     end;
     x[j]:=h;
   end;
   for i:=1 to n do
     listbox1.items.Add(inttostr(x[i]));
end;

Ich habe bei Wikipedia und hier in der Suche schon nachgesehen. Ich finde meinen Fehler nicht. Könnte bitte jemand mal sehen, wo mein Fehler ist. Danke.

Anika


Horst_H - So 06.01.13 16:22

Hallo,

Nach der While-Schleife ist j um 1 zu klein.

Delphi-Quelltext
1:
2:
      end;
     x[j+1]:=h;


Als kleines Konsolenprogramm

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:
{$APPTYPE CONSOLE}
const
  n = 10;
var
  x : array [1..n] of integer;

procedure Sort;
var
  h,i,j : integer;
begin
  for i:=2 to n do
    begin
    h:=x[i];
    write('Stelle:',i:3,' mit Wert ',h:3' rueckt an Stelle');
    j:=i-1;
    while (j>0and (h<x[j]) do
      begin
      x[j+1]:=x[j];
      j:=j-1;
      end;
    writeln('-> ',j+1);
     x[j+1]:=h;   //<--- dort passierte es
    end;
writeln;
  for i:=1 to n do
    Writeln(i:10,x[i]:10);
end;
var
  i : integer;
Begin
  // Belege x umgekehrt sortiert
  For i := 1 to n do
    x[i] := n-i+1;  
  Sort;
end.


Gruß Horst


Anika - So 06.01.13 17:06

Danke für die Hilfe.
Jetzt funktioniert es einwandfrei.

Anika