Pomoc usytuowania liczników zamian i porównań w procedurach sortowania w FreePascal.

0

Witam
Mam problem w prawidłowym usytuowaniu liczników zamian w procedurach sortowania.
Liczniki porównań to:
LiczPorBab - Licznik Porównań Sortowania Bąbelkowego
LiczZamBab - Licznik Zamian Sortowania Bąbelkowego
LiczZamWsta - Licznik Zamian Sortowania przez Wstawianie
LiczPorWsta - Licznik Porównań Sortowania przez Wstawianie
LiczPorShell - Licznik porównań Sortowania Shell
LiczZamShell - Licznik zamian Sortowania Shell
LiczPorSzyb - Licznik Porównań Sortowania Szybkiego
LiczZamSzyb - Licznik Zamian Sortowania Szybkiego

Proszę o pomoc. Pozdrawiam

procedure SortowanieBabelkowe();
var
  i, j, x : Integer;
begin
  //Sortowanie zbioru i liczenie zamian
  LiczPorBab := (n - 1) * (n - 1);
  for i := 1 to N - 1 do
    for j := 1 to N - 1 do
      if Tb[j] > Tb[j + 1] then
      begin
        x := Tb[j];
        Tb[j] := Tb[j + 1];
        Tb[j + 1] := x;
        LiczZamBab := LiczZamBab + 1;
      end;
end;

procedure SortowaniePrzezWstawianie();
var
  i, j, x : Integer;
  licznik : Real;
begin
  for j := N - 1 downto 1 do
  begin
    x := Tb[j];
    i := j + 1;
    while (i <= N) and (x > Tb[i]) do
    begin
      Tb[i - 1] := Tb[i];
      inc(i);
      LiczZamWsta := LiczZamWsta + 1;
    end;
    Tb[i - 1] := x;
    LiczPorWsta := LiczPorWsta + 1;
  end;

end;

procedure SortowanieShella();
var
  h, i, j, x : integer;
begin
  h := 1;
  repeat
    h := 3 * h + 1;
  until h >= N;
  h := (h div 9);
  if h = 0 then
    h := 1; // istotne dla małych N, dla większych można pominąć!

  // Sortujemy
  while h > 0 do
  begin

    for j := N - h downto 1 do
    begin
      x := Tb[j];
      i := j + h;
      while (i <= N) and (x > Tb[i]) do
      begin
        Tb[i - h] := Tb[i];
        inc(i, h);
      end;
      Tb[i - h] := x;
      LiczPorShel := LiczPorShel + 1;
    end;
    h := h div 3;
  end;
  LiczZamShel := LiczZamShel + 1;
end;

procedure SortowanieSzybkie(lewy, prawy : integer);
var
  i, j, piwot, x : Integer;
begin
  LiczPorSzyb := LiczPorSzyb + 1;
  i := (lewy + prawy) div 2;
  piwot := Tb[i];
  Tb[i] := Tb[prawy];
  j := lewy;
  for i := lewy to prawy - 1 do
    if Tb[i] < piwot then
    begin
      x := Tb[i];
      Tb[i] := Tb[j];
      Tb[j] := x;
      inc(j);
    end;
  Tb[prawy] := Tb[j];
  Tb[j] := piwot;
  if lewy < j - 1 then
    SortowanieSzybkie(lewy, j - 1);
  if j + 1 < prawy then
    SortowanieSzybkie(j + 1, prawy);
  LiczZamSzyb := LiczZamSzyb + 1;
end;
0

kiedyś wiersze były numerowane, ech...

0

Mam problem

Gramy w 100 pytań? No to 1: Jaki problem???

0

To może inaczej, liczniki źle liczą ilość zamian i porównań ponieważ są umieszczone w nieodpowiednich liniach kodu.
Pozdrawiam

0

Widzę że odpowiedzi żadnej nie dostanę, najwidoczniej nikt już w Pascalu nie programuje a bo i racja kto w takim umierającym języku chciał by cokolwiek pisać :P. Następna sprawa to że dodanie komentarza przez użytkownika Furious Programming nic nie wnosi do rozwiązania problemu. Myślałem że forum jest do udzielania pomocy, i proszę mi nie pisać że chce wszystko na tacy, bo tak nie jest. Mam napisane wiele jeszcze innych procedur wraz z graficznym menu które tu nie wklejałem ponieważ nie mam z nimi problemów.
Osobiście nie jestem programistą i nie mam zamiaru nim zostać potrzebuje tego na zaliczenie i nie mam już za bardzo czasu na analizowanie tego przypadku, ponieważ mam jeszcze inne zaliczenia na które też muszę poświęcić trochę czasu. Pomimo tego nadal pozdrawiam ;)

0

Jakie wyniki otrzymujesz przy jakich danych wejściowych, a jakich oczekujesz?

0

Nie jestem pewien jakie wyniki powinienem otrzymać , ponieważ jest to uzależnione od algorytmu. Ale w ramach testu tworze tablice posortowaną oraz liczebność zbioru N ustawiam na 5 i w wyniku zamian powinienem otrzymać 0 zamian. W algorytmie bąbelkowym i przez wstawianie liczba zamian się zgadza czyli 0 ale w algorytmie Shella liczba zamian = 1 i Szybkie liczba zamian = 4. W związku z tymi błędnymi danymi nie wierzę też w wyniki liczby porównań. Pozdrawiam

0

Sarrus, wszystko jest proste, autor tematu nie rozumie nic a nic co się dzieje w tym kodzie.
Więc nie wie gdzie następuje porównanie a gdzie następuje zamiana.
Tak a propos dla algorytmu wstawiania nie ma zamiany jako takiej więc cokolwiek zrobisz i tak można podważyć poprawność, rozwiązania:

  • wywalić sortowanie przez wstawianie zamienić na sortowanie przez wybieranie.
  • zastąpić licznik zamian na dwa liczniki: odczytu i zapisu

Najprościej tu zrobić klasę zawierającą tablicę oraz liczniki. Dodać metody Mniej(i,k), Wiecej(i,k), MniejRowne(i,k), WiecejRowne(i,k), Zamien(i,k) które oprócz działania wskazanego przez nazwę zwiększą odpowiednie liczniki. Po czym przerobić metody sortowania tak aby korzystali z tych właśnie metod.

0
_13th_Dragon napisał(a):

Sarrus, wszystko jest proste, autor tematu nie rozumie nic a nic co się dzieje w tym kodzie.
Więc nie wie gdzie następuje porównanie a gdzie następuje zamiana.

Wiem o tym. Program jest od kogoś, lub z netu. Pomógłbym, bo autor tematu zrobił coś więcej niż przeklejenie treści zadania, ale niestety nie mam dość czasu, żeby pochylić się nad problemem.

0

Dziękuje za zainteresowanie. Za radą Sarrusa zamieniłem sortowanie przez wstawianie na sortowanie przez wybór. Zmieniłem algorytmy bąbelkowy i sortowanie przez wybór na kod który ogarnełem i jestem na 99% pewien ich wyników. Teraz potrzebuje pomocy do 2 pozostałych algorytmów (Sortowanie Shell i Szybkie) lub ewentualnie zamianę na algorytm prosty do zrozumienia i zaimpletowania liczników pomiaru porównań i zamian. Pozdrawiam

0

jeśli nie rozumiesz Shella albo QuickSorta to zmień na MergeSort bo jest trywialnie prosty :)

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