Придумал один довольно-таки тупой алгоритм. Но работает. Реализация, к сожалению, на Паскале - на Си я не пишу. Полагаю, что перевести с языка на язык проблем не составит. Если, конечно, алгоритм устроит.
Суть:
1. Ищется максимальное значение исходного массива (М).
2. Путем последовательного перебора натуральных чисел (i) от 0 до М заполняется массив счетчиков количества вхождений каждого i в исходный массив.
3. Организован вывод опять же чисел i от 0 до М и соответствующих значений счетчиков, но только тех, где счетчики отличны от нуля.
Всё.
Код:
const
n=7;
array1:Array[1..n] of Integer= (3,8,3,12,11,8,8); // оригинальный массив
var
array3:Array[0..1000] of Integer; // массив счетчиков
M,i,j:Integer;
BEGIN
M:=0;
for i:=1 to n do
if array1[i]>M then M:=array1[i];
for i:=0 to M do array3[i]:=0;
for i:=0 to M do
for j:=1 to n do
if array1[j]=i then Inc(array3[i]);
for i:=0 to M do
if array3[i]>0 then
writeln(i:4,' - ',array3[i]);
readln;
END.