Сортировка подсчетом

     Идея алгоритма заключается в простом подсчете количества вхождений каждого числа в массив. Это делается так: выполним один проход массива и для каждого числа из отрезка [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.

 

 

Hosted by uCoz