{быстрая сортировка}
procedure QuickSort;{рекурсивная}
 {сортировка от l-го до r-го}
 procedure Sort(l,r:index);
  var i,j:index; x,w:integer;
  begin
   {установка границ разделения}
   i:=l; j:=r;
   {выбор барьера x}
   x := a[(l+r) div 2];
   {разделение элементов отн-но x}
   repeat
    {поиск элементов для обмена}
    while f(a[i]) < f(x) do i:=i+1;
    while f(x) < f(a[j]) do j:=j-1;
    if i<=j then
    begin
     {обмен а[i] и a[j] }
     w:=a[i]; a[i]:=a[j]; a[j]:=w;
     i:=i+1; j:=j-1
    end
   until i > j;
   if l < j then Sort(l,j);
   if i < r then Sort(i,r)
  end;{Sort}
 begin Sort(1,n)
 end;{QuickSort}
