Сортировка подсчетом
Идея алгоритма заключается в простом подсчете количества вхождений каждого числа в массив. Это делается так: выполним один проход массива и для каждого числа из отрезка [0, max] подсчитаем сколько раз оно встретится. Вычисленные количества сохраним в специальном массиве счетчиков. Затем запишем в массив - результат (а это может быть и исходный массив) каждое число столько раз, чему равно значение соответствующего ему счетчика, то есть, сколько раз оно встретилось.
Назовем Исходный массив - Массивом. Пусть в Массиве N - элементов лежащих в отрезке [0, max]
Алгоритм
Для всех элементов Массива делать
Счетчик с номером равным текущему элементу увеличить на 1
Индекс =0
Для всех Чисел от 0 до max делать
Номер = 0
Пока Номер < Очередного счетчика делать
Элемент Массива с Индексом = Числу
Номер увеличить на 1
Индекс увеличить на 1
Заметим, что для этого алгоритма необходим вспомогательный массив, размер которого зависит не от количества элементов в массиве, а от значения максимального элемента. Поэтому данный алгоритм можно использовать только при относительно небольших значениях max.
Текст программы
MODULE example;
IMPORT In, StdLog;
PROCEDURE Sort*;
VAR
a:ARRAY 100 OF INTEGER;
b:ARRAY 1000 OF INTEGER;
N,i,k,j:INTEGER;
BEGIN
N:=-1;
In.Open;
REPEAT
N:=N+1;
In.Int(a[N]);
UNTIL ~In.Done;
FOR i:=0 TO 999 DO
b[i]:=0;
END;
FOR i:=0 TO N-1 DO
b[a[i]]:=b[a[i]]+1;
END;
j:=0;
FOR i:=0 TO 999 DO
FOR k:=1 TO b[i] DO
a[j]:=i;
j:=j+1;
END;
END;
FOR i:=0 TO N-1 DO
StdLog.Int(a[i]);
END;
END Sort;
END example.