Ergänzung
Hallo Stefan,
Weil du hier jede Zahl mit jeder anderen
vergleichst. Die erste Zahl wird in
deinem Fall mit 31 anderen Zahlen
verglichen, die zweite Zahl noch mit 30
anderen Zahlen, die dritte mit 29 anderen
Zahlen … Du machst also insgesamt
1+2+3+4+5+…+31 = 496 Vergleiche!
So ist es. Ich möchte dazu aber noch anmerken, daß es nicht nur auf die Anzahl der Vergleiche ankommt, sondern auch auf die Anzahl der während des Sortiervorganges durchgeführten Vertauschungen. Und da sieht es bei Bubblesort ganz besonders schlecht aus: Bis ein Random-gefülltes Array mit 750 Elementen fertigsortiert ist, finden sowohl in BubbleSort als auch in SelectSort jeweils ca. 280000 Vergleiche statt. In BubbleSort finden außerdem ca. 140000 Vertauschungen statt, in SelectSort aber nur 749! Daher ist SelectSort auch bei kleinen Arrays schneller als BubbleSort (BubbleSort ist überhaupt der langsamste Sortieralgorithmus und hat eigentlich nur theoretische Bedeutung).
Hier der SelectSort-Algorithmus in Pascal (wobei der Typ „TDataField“ definiert ist als „TYPE TDataField = ARRAY[1…n] OF INTEGER“):
PROCEDURE SelectSort (VAR a: TDataField; n: INTEGER);
VAR
i: INTEGER;
j: INTEGER;
h: INTEGER;
z: INTEGER;
begin
FOR i := 1 TO n-1 DO
begin
h := a[i];
z := i;
FOR j := i+1 TO n DO
begin
IF h\>a[j] THEN
begin
h := a[j];
z := j
end
end;
a[z] := a[i];
a[i] := h
end
end;
Die Idee von SelectSort: Suche im „oberen“, noch unsortierten Teil des Arrays das kleinste Element (Aufgabe der j-Schleife) und vertausche dieses mit dem Element an der Position, wo der obere Teil des Arrays beginnt (Position i). Die Grenze selbst wandert von ganz unten (1) bis ganz oben (n).
procedure sort (var a : array[0…31] of integer);
Hups - das geht nicht. In einer Parameterübergabe dürfen nur vorher separat (in einem TYPE-Block) definierte Typen vorkommen. Also:
TYPE TFeld = array[0..31] of integer;
procedure sort (var a: TFeld);
begin
...........
end;
Übrigens: SelectSort ist unschlagbar, was die Anzahl der Vertauschungen angeht. Auch das schnelle Quicksort „vertauscht mehr“, kommt dafür aber mit einer besonders kleinen Anzahl an Vergleichen aus (bei einem 750-Elemente-Random-Array ca. 9000 Vergleiche, ca. 2000 Vertauschungen).
Sorry, ich hoffe, Du fühlst Dich jetzt nicht „belehrt“ (ich hasse das auch), aber diese Ergänzung lag mir am Herzen.
Mit freundlichem Gruß
Martin