Sortowanie bąbelkowe - liczba zamian.

0

Witam,
mam problem z wyswietleniem liczby zamian.
Napisałem coś takiego:

procedure TForm1.Button5Click(Sender: TObject);
type
  a1 = array [0 .. 100000] of integer;
var
  LICZ: TStringlist;
  t: text;
  N, w, i, j: integer;
  intLicznikZamian:integer;
  intLicznikPorownan:integer;
  a: a1;
  start, stop, elapsed : cardinal;
begin
  start := GetTickCount;
  LICZ := TStringlist.Create;
  LICZ.LoadFromFile('przedsortowaniem.txt');
  N := LICZ.Count;
  LICZ.Free;
  begin
    intLicznikZamian:=0;
    intLicznikPorownan:=0;
    assignFile(t, 'przedsortowaniem.txt');
    reset(t);
    for i := 1 to N do
    begin
      readln(t, w);
      a[i] := w;
    end;
    CloseFile(t);
    for i:=1 to N do
    for j:=1 to N-1 do
    if (a[j]>a[j+1]) then
    begin
    w := a[j];
    a[j] := a[j+1];
    a[j+1] := w;
    inc(intLicznikPorownan);
    end;
    assignFile(t, 'posortowaniu.txt');
    ReWrite(t);
    for i:=1 to N do
    Writeln(t, a[i]);
    end;
    CloseFile(t);
  Label7.Caption:=FloatToStr(N);
  Label4.Caption:=FloatToStr(intLicznikZamian);
  Label5.Caption:=FloatToStr(intLicznikPorownan);
  stop := GetTickCount;
  elapsed := stop - start;
  ShowMessage('Czas wykonania sortowania: ' + IntToStr(elapsed) + ' ms.');
end;                      

liczbe sprawdzen mi wyswietla a nie mam pojecia gdzie wstawic liczbe zamian aby wyswietlalo.

Bardzo bym prosil o pomoc bo juz wpisalem w kazda linijke i bez zadnego rezultatu.

0

Nie da się na to patrzeć - beznadziejne formatowanie oraz za dużo odpowiedzialności w ramach jednej procedury.

Wyrzuć ten kod do kosza i napisz od nowa, wydzielając funkcjonalności - wczytywanie pliku nie ma nic wspólnego z samym sortowaniem, zatem nie powinno się znajdować w tej samej procedurze.

0

Kod jak najbardziej działa, więc jest dobry. To, że jest wszystko podpięte pod jeden przycisk nie ma tu nic do rzeczy.

Byłbym wdzięczny za pomoc w tą liczbą zamian.

3

Liczbę porównań inkrementujesz tuż przed warunkiem If, a liczbę swapów przed lub po swapie:

for i:=1 to N do
  for j:=1 to N-1 do
  begin
    Inc(intLicznikPorownan);

    if (a[j]>a[j+1]) then
    begin
      Inc(intLicznikZamian);

      w := a[j];
      a[j] := a[j+1];
      a[j+1] := w;
    end;
  end;

Kod jest paskudny, niesformatowany i czyta się go tragicznie; To że działa, nie ma najmniejszego znaczenia - kompilator przełknie każdą siekę; A jeśli chcesz, aby ktoś pomógł z Twoim kodem, to najpierw ten kod sformatuj, bo inaczej nikomu nie będzie się chciało marnować czasu na jego analizę;

PS: Dobry kod to taki, który działa prawidłowo, a także jest czytelny i w mgnieniu oka można go zrozumieć; Twój ani nie działa prawidłowo (dlatego założyłeś wątek), ani nie wygląda dobrze.

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