bt_bb_section_bottom_section_coverage_image

Sortiranje liste

program SortirajListu;
type pokelement =^element;
    element = record
            podatak :integer;
            sledeci :pokelement;
            end;
            
function dodaj(p :pokelement; n :integer) :pokelement;
var pom :pokelement;
begin
if p = nil then
    begin
    new(p);
    p^.podatak := n;
    p^.sledeci := nil;
    end
else
    begin
    pom := p;
    while pom^.sledeci <> nil do
        pom := pom^.sledeci;
    new(pom^.sledeci);
    pom := pom^.sledeci;
    pom^.podatak := n;
    pom^.sledeci := nil;
    end;
dodaj := p;
end;

procedure stampaj_listu( p:pokelement );
var pom:pokelement;
begin
pom := p;
if p <> NIL then
	begin
	repeat
		write(pom^.podatak,' ');
	    pom:=pom^.sledeci;
	until pom = NIL;
	writeln;
	end
else
	writeln('Lista je prazna.');
writeln;
end;

function sortirajListu(p: pokelement): pokelement;
var sortirano, trenutni, novi: pokelement;
begin
sortirano := NIL;
while p <> NIL do
    begin
    novi := p;
    p := p^.sledeci;
    if (sortirano = NIL) or (novi^.podatak <= sortirano^.podatak) then
        begin
        novi^.sledeci := sortirano;
        sortirano := novi;
        end
    else
        begin
        trenutni := sortirano;
        while (trenutni^.sledeci <> NIL) and (trenutni^.sledeci^.podatak < novi^.podatak) do
            trenutni := trenutni^.sledeci;
        novi^.sledeci := trenutni^.sledeci;
        trenutni^.sledeci := novi;
        end;
    end;
sortirajListu := sortirano;
end;

var x, i, n :integer;
    glava :pokelement;
    
begin
glava := nil;
writeln('Unesi broj elemenata u listi:');
readln(n);
for i:=1 to n do
		begin
		writeln('Unesi ',i,'. element:');
    readln(x);
		glava := dodaj(glava, x);
		end;
writeln('Kreirana lista pre sortiranja je:');
stampaj_listu( glava );
writeln;
glava := sortirajListu(glava);
writeln('Kreirana lista posle sortiranja je:');
stampaj_listu(glava);
end.
Kako funkcioniše

1. Inicijalizacija pokazivača

sortirano := NIL;
  • sortirano je pokazivač na sortirani deo liste. Početno je postavljen na NIL jer lista još nije sortirana.

2. Prolazak kroz nesortirani deo liste

while p <> NIL do
  • Petlja while p <> NIL se koristi da bi se prolazilo kroz nesortirani deo liste. p pokazuje na trenutni nesortirani element liste.

3. Uzimanje trenutnog elementa za sortiranje

novi := p;
p := p^.sledeci;
  • novi := p: Čuvamo trenutni element p koji će biti umetnut u sortirani deo.
  • p := p^.sledeci: Pomera se na sledeći element nesortiranog dela liste.

4. Umetanje u prazan ili već sortirani deo liste

if (sortirano = NIL) or (novi^.podatak <= sortirano^.podatak) then
begin
    novi^.sledeci := sortirano;
    sortirano := novi;
end
  • Ako je sortirani deo liste prazan (sortirano = NIL) ili ako je podatak trenutnog elementa novi^.podatak manji ili jednak prvom elementu u sortiranoj listi (novi^.podatak <= sortirano^.podatak), umetnemo novi na početak sortirane liste.
  • novi^.sledeci := sortirano povezuje novi element sa trenutnim prvim elementom sortirane liste.
  • sortirano := novi pomera pokazivač na novi prvi element sortirane liste.

5. Umetanje u sredinu ili kraj liste

trenutni := sortirano;
while (trenutni^.sledeci <> NIL) and (trenutni^.sledeci^.podatak < novi^.podatak) do
    trenutni := trenutni^.sledeci;
novi^.sledeci := trenutni^.sledeci;
trenutni^.sledeci := novi;
  • Ako novi element treba da se umetne u sredinu ili kraj liste, tražimo odgovarajuće mesto:
    • trenutni := sortirano inicijalizuje pomoćni pokazivač na početak sortirane liste.
    • while (trenutni^.sledeci <> NIL) and (trenutni^.sledeci^.podatak < novi^.podatak): Petlja prolazi kroz sortiranu listu dok ne pronađe mesto gde je novi^.podatak manji ili jednak sledećem elementu.
    • novi^.sledeci := trenutni^.sledeci: Novi element se povezuje sa sledećim elementom trenutnog elementa.
    • trenutni^.sledeci := novi: Povezujemo trenutni element sa novim elementom, efektivno ga umetnuvši u listu.

6. Vraćanje početnog pokazivača

sortirajListu := sortirano;
  • Na kraju funkcije, vraćamo početni pokazivač sortirano, koji sada pokazuje na početak sortirane liste.

image

2 thoughts on “Sortiranje liste

Komentariši