1)Устанавливаем левую и правую границу l и r(с какого по какой элемент мы хотим отсортировать) .
2)Находим средний элемент между правой и левой границей x (относительно этого элемента мы будем сортировать наш массив) .
3) Пока индикатор i > индикатора j то:
а) Теперь (если сортируем по возрастанию) то ищем слева , от среднего элемента x , элемент который >=x
б) А справа элемент который <=x
в) И если индикаторы i и j не пересеклись то меняем местами элементы a[ i ] и a[ j ] и увеличиваем(или уменьшаем) индикаторы i и j
4) Если индикатор j < правой границы r то запускаем сортировку от этих границ.
5) И если индикатор j > левой границы l то запускаем сортировку от этих границ.
Теперь сам код:
var a:array [1..1000000] of longint;
i,n:longint;
procedure qSort(l,r:longint);
var i,j,z,x:longint;
begin
i:=l;
j:=r;
x:=a[(i+j)div 2];{находим средний элемент}
repeat
while a[i]<x do i:=i+1;{ищем слева элемент который >=x }
while a[j]>x do j:=j-1;{а справа элемент который <=x }
if i<=j then begin
z:=a[i];
a[i]:=a[j];
a[j]:=z;
i:=i+1;
j:=j-1;
end; {меняем местами элементы a[i] и a[j] и изменяем индикаторы i и j}
until (i>j);
if i<r then qSort(i,r);
if j>l then qSort(l,j);
end;
begin
readln(n);
for i:=1 to n do
read(a[i]);
qSort(1,n); {задаём границы сортировки}
for i:=1 to n do
write(a[i],' ');
end.