home *** CD-ROM | disk | FTP | other *** search
- procedure bubble_sort;
- var bb:boolean;
- (* sortiert alle karteikarten alphabetisch nach einem angegebenen feld *)
- begin
- if kartanz>1 then
- begin
- if (erster_begriff[feld]<>nil) and (sortierer='') then
- sortierer:=erster_begriff[feld]^.begriff;
- kt:=nix; bb:=false;
- (* bestimme die feldnummer des sortierers *)
- repeat
- kt:=succ(kt);
- fnr:=0;
- repeat
- fnr:=fnr+1;
- hilfstr:=feldnamen[kt,fnr];
- bb:=enthalten_in(sortierer,hilfstr)
- until bb or (fnr>4);
- until bb or (kt=letzter_typ);
- if bb then begin z:=0; repeat
- z:=z+1; karte:=erste_karte;
- y:=0; no_change:=true;
- repeat
- y:=y+1;
- sorthilf:=karte^.naechste;
- (* haben zwei aufeinanderfolgende karten falsche alphabetische reihenfolge, *)
- (* dann vertausche sie *)
- if (sorthilf<>nil) and
- (karte^.inhalt[fnr]>sorthilf^.inhalt[fnr]) then
- begin
- if karte=erste_karte then
- begin
- erste_karte:=sorthilf;
- zwischen:=sorthilf^.naechste;
- sorthilf^.naechste:=karte;
- karte^.naechste:=zwischen;
- no_change:=false;
- end
- else
- begin
- vorgaenger^.naechste:=sorthilf;
- zwischen:=sorthilf^.naechste;
- sorthilf^.naechste:=karte;
- karte^.naechste:=zwischen;
- no_change:=false;
- end;
- end;
- vorgaenger:=karte; karte:=karte^.naechste;
- until y=kartanz-1;
- (* wenn kein tausch mehr erfolgte, ist das sortieren abgeschlossen *)
- until no_change;
- end;
- end;
- end;