Modyfikacja dwóch kodów do sortowania.

0

Witajcie. Mam problem z dwoma programami, nie mogę poradzić sobie z ich dalszą modyfikacją. Pisane one są we Free Pascalu.
Pierwszy z nich to sortowanie bąbelkowe, jednak nie mam pojęcia jaką linijkę wrzucić żeby obliczał liczbę przestawień w ciągu.

program sortowanie_babelkowe;
uses
  Crt;
const
  n=5;
type
  TTablica  = array [1..n] of Integer;

procedure sort_babelkowe(var t : TTablica; n : Integer);
var
  i,j,
  pom  : Integer;
begin
  for j := 1 to n - 1 do
    for i := 1 to n - 1 do begin
      if t[i] > t[i+1] then
        begin
          pom  := t[i];   
          t[i] := t[i+1]; 
          t[i+1] := pom;  
        end;
    end;
end;


const
  tab  : TTablica=(29,9,5,3,37);
var
  i : Integer;
begin
  clrscr;
  writeln('Sortowanie bąbelkowe');
  writeln('Tablica przed sortowaniem');
  for i:=1 to n do write(tab[i],' ');
  writeln;
  sort_babelkowe(tab,n);

  writeln('Tablica po sortowaniu');
  for i:=1 to n do write(tab[i],' ');
  writeln;

  repeat until keypressed;

end.

Drugi z kolei kod, jest sortowaniem przez scalanie, w którym podobnie musze wprowadzić modyfikację, umożliwiającą obliczenie liczby podziałów. Nie radzę sobie z tym.

program sortowanie_przez_scalanie;
uses
  Crt;
const
  n=7;
type
  TTablica  = array [1..n] of Integer;

procedure WypelnijTablice(var tab : TTablica; n : Integer );
var
  i : Integer;
begin
  writeln('Podaj ',n,' liczb');
  for i:=1 to n do readln(tab[i]);
end;

procedure scalaj(var t : TTablica; indPocz, indSrodek, indKon : LongInt);
var
  i, j,
  k    : Integer;
  temp : TTablica;
begin
  i := indPocz;
  j := indSrodek + 1;
  k := indPocz;
  while (i <= indSrodek) and (j <= indKon) do
    begin
      if t[i] < t[j] then  
        begin
          temp[k] := t[i]; 
          Inc(i);
        end
      else
        begin
          temp[k] := t[j]; 
          Inc(j);
        end;
      Inc(k);
    end;

  while i <= indSrodek do 
    begin
      temp[k] := t[i];   
      Inc(i);
      Inc(k);
    end;

  while j <= indKon do   
    begin
      temp[k] := t[j];    
      Inc(j);
      Inc(k);
    end;

  for i := indPocz to indKon do t[i] := temp[i];
end;

procedure sort_scal(var t : TTablica; indPocz, indKon : LongInt);
var
  indSrodek : LongInt;
begin
  if indPocz < indKon then
  begin
    indSrodek := (indPocz + indKon) div 2;
    sort_scal(t,indPocz,indSrodek);
    sort_scal(t,indSrodek + 1,indKon);
    scalaj(t,indPocz, indSrodek, indKon);
  end;
end;


const
  tab  : TTablica=(9,5,14,19,2,3,15);
var
  i : Integer;
begin
  clrscr;
  writeln('Sortowanie przez scalanie');
  writeln('Tablica przed sortowaniem');
  for i:=1 to n do write(tab[i],' ');
  writeln;

  sort_scal(tab,1,n);
  writeln('Tablica po sortowaniu');
  for i:=1 to n do write(tab[i],' ');
  writeln;

  repeat until keypressed;
end.

Za pomoc z góry dziękuję.

dodanie znaczników <code class="pascal"> - @furious programming

1

20zł.

5
  1. Liczba przestawień jest równa liczbie spełnionych warunków, więc zadeklaruj sobie dodatkową zmienną, nadaj jej początkową wartość 0 i inkrementuj tylko wtedy, gdy warunek zostanie spełniony;
  2. Liczba podziałów jest równa liczbie rekurencyjnych wywołań procedury, więc w każdej z nich musisz inkrementować sobie licznik o jeden (i tylko raz na instancję).
0

Btw to:

procedure sort_babelkowe(var t : TTablica; n : Integer);
var
  i,j,
  pom  : Integer;
begin
  for j := 1 to n - 1 do
    for i := 1 to n - 1 do begin
      if t[i] > t[i+1] then
        begin
          pom  := t[i];   
          t[i] := t[i+1]; 
          t[i+1] := pom;  
        end;
    end;
end;

Zamienił bym na to:

procedure sort_babelkowe(var t : TTablica);
var
  i,j,
  pom  : Integer;
begin
  for j := Low(t) to High(t) do
    for i := Low(t) to High(t) do begin
      if t[i] > t[i+1] then
        begin
          pom  := t[i];   
          t[i] := t[i+1]; 
          t[i+1] := pom;  
        end;
    end;
end;

1 użytkowników online, w tym zalogowanych: 0, gości: 1