{ File: ordbubot.pas }

{ Scopo: ordinamento a bolle di un vettore (versione ottimizzata) }

{ E` richiesta la definizione preliminare di:

const
  NumElementi = ...;

type
  TipoElemento = ...;
  TipoIndice   = 1..NumElementi;
  TipoVettore  = array [TipoIndice] of TipoElemento;

}

procedure BubbleSort (var A: TipoVettore);
{ Ordina il vettore A usando l'algoritmo di ordinamento a bolle nella versione
  ottimizzata. }

var
  i, j     : integer;
  temp     : TipoElemento;
  ordinato : boolean;

begin { BubbleSort }
  i := 0;
  repeat                             { inizia fase i                          }
    i := i+1;
    ordinato := TRUE;
    for j := NumElementi downto i+1 do { cominciando dal basso ...            }
      if A[j] < A[j-1] then            {   se due elementi non sono in ordine }
      begin                            {     allora scambiali ...             }
        temp := A[j];
        A[j] := A[j-1];
        A[j-1] := temp;
        ordinato := FALSE              {     e ricordati che non hai finito   }
      end
  until ordinato;                    { e termina quando non hai fatto scambi  }
       { N.B. Quando i assume il valore NumElementi, il ciclo interno non viene
              eseguito e quindi ordinato rimane a TRUE. }
end; { BubbleSort }