How to display string letters sorted by frequency in Pascal

1 Answer

0 votes
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

*)

 



answered 2 days ago by avibootz
edited 2 days ago by avibootz

Related questions

...