Zitat von
Daniel:
Delphi-Quellcode:
Procedure ShellSort;
var i, j, h, v : Integer;
Begin
h:= 1;
Repeat
h:= (3 * h) +1;
Until (h > N);
Repeat
h:= (h
div 3);
For i:= (h+1)
To N
Do
Begin
v:= Data[i];
j:= i;
While ((j > h)
and (Data[j-h] > v))
Do
Begin
Data[j]:= Data[j-h];
dec( j, h );
End;
Data[j]:= v;
End;
Until (h = 1);
End;
Unten das habe ich von Alexander Franz (
http://www.alexander-franz.de):
Delphi-Quellcode:
function TMainFrm.shellSort(zahlen : IntArray): Int64;
var
i, j, k, tmp: Integer;
n : Int64;
const
h :
Array[0..15]
of Integer = (1391376, 463792, 198768, 86961, 33936, 13776,
4592, 1968, 861, 336, 112, 48, 21, 7, 3, 1);
begin
for k:=0
to Length(h)-1
do
begin
for i:=h[k]
to Length(zahlen)
do
begin
j := i;
tmp := zahlen[j];
while ((j>h[k])
AND (tmp<zahlen[j-h[k]]))
do
begin
zahlen[j] := zahlen[j-h[k]];
Dec(j, h[k]);
Inc(n);
end;
zahlen[j] := tmp;
end;
end;
Result := n;
end;
Ich kopiere nur äußerst ungern einen Code und will ihn gern immer selbst verstehen:
Also Shellsort habe ich von der Logik her kapiert:
1. halbe Arraylänge auseinander Einträge vergleich und wenn nötig vertauschen
2. viertel Arraylänge auseinander Einträge vergleich und wenn nötig vertauschen
3.....
...
Also die 2 äußeren Schleifen sind mir klar. Aber was die innere da soll? Das ist doch einfach nur eine Bedingung, wenn die eine größer ist als die andere dann vertausche, ansonsten mache nix.
Und die Bedingung j>h[k]ist auch irgendwie komisch, man hat doch in der for schleife davor genau das festgelegt, dass diese Bedingung immer erfüllt ist.
Und es kann ja nix bingen
Dec(j, h[k]); für den nächsten Durchlauf zu beschreiben, denn j wird ja wieder i zugewiesen. Es kann also nur für die innerste Schleife relevant sein. Doch was macht die da. Die macht doch die Bedingung (j>h[k]) lediglich unerfüllt. Damit läuft die innerste Schleife immer nur genau 1 mal durch. Damit kann man es auch in einer if Bedingung schreiben.
Wisst ihr eine Erklärung?