[Newbie] Optymalizacja sortowania bąbelkowego

0

oto co wyskrobałem na lekcji:

program sortme;
uses crt;
type TTab=packed array [0..100] of Integer;

var Tab: TTab;
    I, J, K, tmp,n,m, count: integer;
begin
  Write('Podaj ilo˜† element˘w: ');
  ReadLN(n);
  Count:=N;
  randomize;
  for I:=0 to n do
    begin
      Tab[I]:=Random(100);
    end;
  m:=n-1;
  while M>0 do
  begin
    for K:=0 to m do
     begin
       if Tab[K]>Tab[K+1] then
         begin
           Tab[K]:=Tab[K] xor Tab[K+1];
           Tab[K+1]:=Tab[K+1] xor Tab[K];
           Tab[K]:=Tab[K] xor Tab[K+1]
           n:=k;
         end;
     end;
    if m=n-1 then
      break;
    m:=N-1;
  end;
  for I:=0 to Count do
    Write(Tab[I]:4);
end.

Pisałem to na lekcji z pamięci, a zadanie polegało na jak najbardziej optymalnym algorytmie na sortowanie bąbelkowe. Co prawda zrobiłem najszybcie i najlepiej, ale nauczycielka uparcie twierdzi że da się cos jeszcze poprawić. Tylko co?

0

Chyba tylko sortowanie "w dwie strony" można zrobić, co przyspiesza tylko ze względu na to, że statystycznie dane tak się rozkładają, że skuteczniejsze jest przechodzenie raz od jednej, a raz od drugiej strony.

var
  i, T: Integer;
  Gora, Dol: Integer;
  Zmiana: Boolean;
begin
...
  Gora := High(A);
  Dol := Low(A);
  Zmiana := True;
  while Zmiana do
  begin
    Zmiana := False;
    for i := Dol to Gora-1 do
      if A[i] > A[i + 1] then
      begin
        T := A[i];
        A[i] := A[i + 1];
        A[i + 1] := T;
        Gora := i;
        Zmiana := True;
      end;
    if not Zmiana then
      Break
    else
    begin
      Zmiana := False;
      for i := Gora-1 downto Dol do
        if A[i] > A[i + 1] then
        begin
          T := A[i];
          A[i] := A[i + 1];
          A[i + 1] := T;
          Dol := i+1;
          Zmiana := True;
        end;
    end;
  end;

Druga rzecz, to pytanie. Optymalizujesz pod względem szybkości czy rozmiaru? Bo te twoje kombinacje z xor są bardzo fajne, jeżeli chcesz zaoszczędzić jedną komórkę pamięci, ale pod względem szybkości jest wolniejsze (chyba, że napisałbyś ten fragment sam w asm). Dlatego typowa zamiana ze zmienną pomocniczą jest szybsza, a tą jedną komórkę (która być może nawet nie będzie w pamięci RAM tylko jako rejestr po zoptymalizowaniu przez kompilator) można poświęcić.
Nie wiem co jeszcze można by zmienić, nie naruszając pojęcia "sortowania bąbelkowego" (choć sortowanie w obydwie strony w pewnym sensie już jest nadwyrężeniem tego).

0

zaraz, to xor jest wolniejsze od przypisywania do zmiennej tymczasowej? ort!, ale zaoszczedzenie pamieci jest... Czyli ogólnie moje jest nie do ruszenia (chodzi o rozmiar kodu i czas jego wykonywania, przy jak najmniejszej liczbie zmiennych)

0

Jeżeli zaś chodzi o samą zamianę zmiennych, to:
http://4programmers.net/Forum/viewtopic.html?id=40180
W przypadku zmiennych porządkowych to rozwiązanie jest chyba optymalne.

0

Akurat tutaj xory lepsze są niż ten sposób z odejmowaniem. A dlaczego xor jest wolniejsze od przypisania? Być może kompilator to optymalizuje i wykorzystuje rejestr do zamiany (jakiegoś xchg da i już).
Pod względem szybkości nie wiem co tu możnaby jeszcze zrobić. Jeżeli chodzi o pamięć, to może by się jeszcze coś pokombinowało, ale generalnie ciężko jest zoptymalizować w obu kierunkach.

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