program LetterFrequency;
{$mode objfpc}{$H+}
// Pair structure: (letter, frequency)
type
TPair = record
Letter: Char;
Freq: Integer;
end;
// Named dynamic array type (required in Pascal)
TPairArray = array of TPair;
// QuickSort for TPairArray — sort by frequency descending
procedure QuickSort(var A: TPairArray; L, R: Integer);
var
i, j: Integer;
pivot: Integer;
temp: TPair;
begin
i := L;
j := R;
pivot := A[(L + R) div 2].Freq;
repeat
while A[i].Freq > pivot do Inc(i);
while A[j].Freq < pivot do Dec(j);
if i <= j then
begin
temp := A[i];
A[i] := A[j];
A[j] := temp;
Inc(i);
Dec(j);
end;
until i > j;
if L < j then QuickSort(A, L, j);
if i < R then QuickSort(A, i, R);
end;
// sortByFrequency — counts how often each letter appears and returns a sorted list
function sortByFrequency(const s: string): TPairArray;
var
freq: array[0..25] of Integer;
i: Integer;
c: Char;
begin
Result := nil; // <-- REQUIRED to silence FPC warning
// Initialize frequency array
for i := 0 to 25 do
freq[i] := 0;
// Iterate through the string and count only alphabetic characters
for c in s do
begin
if c in ['A'..'Z', 'a'..'z'] then
Inc(freq[Ord(UpCase(c)) - Ord('A')]);
end;
// Build array of (letter, frequency) pairs
SetLength(Result, 26);
for i := 0 to 25 do
begin
Result[i].Letter := Chr(Ord('a') + i);
Result[i].Freq := freq[i];
end;
// Sort pairs by frequency in descending order
QuickSort(Result, 0, High(Result));
end;
// Build a string sorted by frequency: ddddddddddddccccccbbbbbaaaafffeehhgs
function buildSortedString(const sorted: TPairArray): string;
var
i: Integer;
begin
Result := '';
for i := 0 to High(sorted) do
if sorted[i].Freq > 0 then
// append 'sorted[i].Letter' repeated sorted[i].Freq times
Result := Result + StringOfChar(sorted[i].Letter, sorted[i].Freq);
end;
var
text: string;
sorted: TPairArray;
p: TPair;
letters_sorted_by_frequency: string;
begin
text := 'bbcabddddccafffadbbcdccsedddddhhgade';
sorted := sortByFrequency(text);
// Print each letter and its frequency
for p in sorted do
if p.Freq <> 0 then
WriteLn(p.Letter, ': ', p.Freq);
// Print the reconstructed sorted string
letters_sorted_by_frequency := buildSortedString(sorted);
WriteLn;
WriteLn('Sorted string: ', letters_sorted_by_frequency);
end.
(*
run:
d: 12
c: 6
b: 5
a: 4
f: 3
h: 2
e: 2
s: 1
g: 1
Sorted string: ddddddddddddccccccbbbbbaaaafffhheesg
*)