How to merge overlapping ranges (start,end),(start,end) in Pascal

1 Answer

0 votes
program MergeRanges;

type
  TRange = record
    StartVal : Integer;
    EndVal   : Integer;
  end;

const
  MaxRanges = 20;

var
  Ranges : array[1..MaxRanges] of TRange;
  Merged : array[1..MaxRanges] of TRange;
  N, M, I, J : Integer;
  Temp : TRange;

begin
  { Input ranges }
  N := 5;
  Ranges[1].StartVal := 302; Ranges[1].EndVal := 447;
  Ranges[2].StartVal := 488; Ranges[2].EndVal := 489;
  Ranges[3].StartVal := 121; Ranges[3].EndVal := 234;
  Ranges[4].StartVal := 200; Ranges[4].EndVal := 421;
  Ranges[5].StartVal := 140; Ranges[5].EndVal := 354;

  { Sort by StartVal (simple bubble sort for clarity) }
  for I := 1 to N - 1 do
    for J := I + 1 to N do
      if Ranges[J].StartVal < Ranges[I].StartVal then
      begin
        Temp := Ranges[I];
        Ranges[I] := Ranges[J];
        Ranges[J] := Temp;
      end;

  { Merge }
  M := 0;

  for I := 1 to N do
  begin
    if (M = 0) or (Ranges[I].StartVal > Merged[M].EndVal) then
    begin
      Inc(M);
      Merged[M] := Ranges[I];
    end
    else
    begin
      if Ranges[I].EndVal > Merged[M].EndVal then
        Merged[M].EndVal := Ranges[I].EndVal;
    end;
  end;

  { Output }
  for I := 1 to M do
    writeln('(', Merged[I].StartVal, ', ', Merged[I].EndVal, ')');
end.



(*
run:

(121, 447)
(488, 489)

*)


 



answered Jan 26 by avibootz
...