program quick_sort;
uses
  crt;
const
  MAX=10;
type
  vetor=array[1..MAX] of integer;
var
  vet:vetor;

procedure quicksort(var vet:vetor; m,n:integer);

procedure partition(var vet:vetor; var i,j:integer);
var
  pivot,temp:integer;
begin
  pivot:=vet[(i+j) Div 2];  { escolhe o valor do meio como pivot }
  repeat begin
    while (vet[i] < pivot) do inc(i);
    while (vet[j] > pivot) do dec(j);
    if (i <= j)
    then begin
           temp:=vet[i];
           vet[i]:=vet[j];
           vet[j]:=temp;
           inc(i);
           dec(j);
         end;
    end;
  until (i > j);  { i e j se cruzaram... i passou j }
end;

var
  i,j:integer;
begin
  if (m < n)
  then begin
         i:=m;   { i e j indicam o primeiro e ultimo elementos }
         j:=n;
         partition(vet,i,j); { quebra o vetor[m..n] em: }
         quicksort(vet,m,j); {   => vet[m..j]           }
         quicksort(vet,i,n); {   => vet[i..n]           }
       end;
end;

var
  V:vetor;
  aux:integer;
begin
  writeln('Entre com o ',MAX,' valores: ');
  for aux:=1 to MAX
  do readln(V[aux]);
  clrscr;
  writeln('Vetor antes da ordena‡Æo: ');
  for aux:=1 to MAX
  do write(V[aux],' ');
  writeln;
  quicksort(V,1,MAX);
  writeln('Vetor depois da ordena‡Æo: ');
  for aux:=1 to MAX
  do write(V[aux],' ');
  readln;
end.

