Algorytmy: lista kroków, pseudokod, schemat blokowy; sortowanie, wyszukiwanie, rekurencja

INF.03 · teoria
autor: redakcja · 02.11.2026
Analiza danych wejściowych i wyniku, trzy sposoby zapisu algorytmu oraz śledzenie jego działania. Wyszukiwanie liniowe i binarne, sortowanie bąbelkowe i rekurencja w Pythonie. Lekcja 10.2 kursu INF.03.

[ INF.03: PYTANIA Z TEGO DZIAŁU ]

Al­go­rytm to jed­no­znacz­ny ciąg czyn­no­ści pro­wa­dzą­cy od do­pusz­czal­nych danych do ocze­ki­wa­ne­go wyniku. Na eg­za­mi­nie trzeba od­czy­tać listę kroków, sche­mat blo­ko­wy albo kod i usta­lić re­zul­tat. W za­da­niu prak­tycz­nym ta sama umie­jęt­ność pomaga za­pla­no­wać ob­li­cze­nie, zanim po­ja­wią się szcze­gó­ły skład­ni JavaScript lub PHP.

Naj­pierw dane i wa­run­ki

Ana­li­za pro­ble­mu za­czy­na się od wska­za­nia wej­ścia i wyj­ścia. Dla wy­szu­ki­wa­nia pro­duk­tu wej­ściem może być lista iden­ty­fi­ka­to­rów i szu­ka­ny iden­ty­fi­ka­tor. Wyj­ściem jest po­zy­cja pro­duk­tu albo in­for­ma­cja o braku. Trzeba też usta­lić, czy lista jest upo­rząd­ko­wa­na, czy za­wie­ra po­wtó­rze­nia i od ja­kie­go numeru li­czy­my po­zy­cje. Bez tego okre­śle­nie „znajdź pro­dukt” jest za mało pre­cy­zyj­ne.
Za­ło­że­nie opi­su­je wa­ru­nek do­pusz­czal­nych danych. Jeżeli al­go­rytm dzieli przez liczbę ele­men­tów, musi usta­lić za­cho­wa­nie dla pustej listy. Jeżeli szuka bi­nar­nie, wymaga wła­ści­we­go upo­rząd­ko­wa­nia danych. Przy­kład jed­ne­go po­praw­ne­go wyniku nie do­wo­dzi dzia­ła­nia dla wszyst­kich przy­pad­ków. Dla­te­go przy­go­to­wu­je się także pustą listę, jeden ele­ment, szu­ka­ną war­tość na końcu i war­tość nie­obec­ną.
Prze­śle­dze­nie al­go­ryt­mu polega na wy­ko­na­niu ko­lej­nych kroków z za­pi­sa­niem stanu. W pro­stej tabeli po­moc­ni­czej można no­to­wać numer kroku, indeks i bie­żą­cy wynik. To szcze­gól­nie przy­dat­ne przy pętli, bo ostat­nia war­tość licz­ni­ka po za­koń­cze­niu nie musi być ostat­nią war­to­ścią uży­wa­ną w jej treści. Od­po­wiedź wynika z prze­bie­gu, a nie z liczby wier­szy kodu.

Lista kroków, pseu­do­kod i sche­mat

Lista kroków opi­su­je czyn­no­ści zwy­kłym ję­zy­kiem. Dla więk­szej z dwóch liczb wy­star­czy: wczy­taj a i b, po­rów­naj je, wypisz a gdy jest więk­sze, a w prze­ciw­nym przy­pad­ku wypisz b. Gdy liczby są równe, wy­pi­sa­nie któ­rej­kol­wiek daje tę samą war­tość. Ta de­cy­zja po­win­na być jawna, aby od­czy­tu­ją­cy nie musiał jej do­po­wia­dać.
Pseu­do­kod to zapis po­dob­ny do pro­gra­mu, ale nie­za­leż­ny od do­kład­nej skład­ni kon­kret­ne­go języka. Musi mieć wy­ja­śnio­ne ope­ra­cje i zna­cze­nie wa­run­ków. Słowo WYPISZ ozna­cza prze­ka­za­nie wyniku, a nie utwo­rze­nie zmien­nej. Strzał­ki przy­pi­sa­nia można za­stą­pić słowem „ustaw”, żeby nie po­my­lić przy­pi­sa­nia z ma­te­ma­tycz­ną rów­no­ścią.
1
2
3
4
5
6
WCZYTAJ a, b
JEŻELI a > b
WYPISZ a
W PRZECIWNYM RAZIE
WYPISZ b
KONIEC
Sche­mat blo­ko­wy po­ka­zu­je czyn­no­ści i kie­run­ki przejść. Owal ozna­cza po­czą­tek lub koniec, pro­sto­kąt ope­ra­cję, rów­no­le­gło­bok wej­ście lub wyj­ście, a romb de­cy­zję. Wyj­ścia z de­cy­zji trzeba pod­pi­sać, na przy­kład TAK i NIE. Sama od­le­głość bloków na ry­sun­ku nie wska­zu­je ko­lej­no­ści; po­ka­zu­ją ją linie kie­run­ko­we.
Schemat wyboru większej liczby: po wczytaniu a i b warunek a > b kieruje do wypisania a albo b, a obie drogi prowadzą do końca
Dla a rów­ne­go 7 i b rów­ne­go 4 wy­bie­ra­na jest gałąź TAK i wynik 7. Dla 2 oraz 9 gałąź NIE daje 9. Dla 5 oraz 5 rów­nież wy­bie­ra­na jest gałąź NIE, ale wynik nadal wynosi 5. Ten trzeci przy­pa­dek spraw­dza gra­ni­cę wa­run­ku, której dwa po­zo­sta­łe nie obej­mu­ją.

Wy­szu­ki­wa­nie li­nio­we i bi­nar­ne

Wy­szu­ki­wa­nie li­nio­we spraw­dza ele­men­ty ko­lej­no, aż znaj­dzie pa­su­ją­cy lub doj­dzie do końca. Nie wymaga upo­rząd­ko­wa­nia. Dla listy 8, 3, 6, 3 i szu­ka­nej war­to­ści 6 od­wie­dza in­dek­sy 0, 1 oraz 2. Jeżeli zwra­ca­my pierw­sze tra­fie­nie, dla war­to­ści 3 wy­ni­kiem będzie indeks 1. Indeks jest nu­me­rem po­zy­cji, a nie samą zna­le­zio­ną war­to­ścią.
1
2
3
4
5
6
7
8
def znajdz_liniowo(dane, szukana):
for indeks in range(len(dane)):
if dane[indeks] == szukana:
return indeks
return -1
print(znajdz_liniowo([8, 3, 6, 3], 6))
Wynik to 2. Funk­cja range (ZAKRES) tworzy ko­lej­ne in­dek­sy od zera do liczby ele­men­tów bez ostat­niej gra­ni­cy, len podaje liczbę ele­men­tów, a return (ZWRÓĆ) kończy funk­cję. Wynik -1 jest umowną in­for­ma­cją o braku. Nie należy potem bez spraw­dze­nia używać go jako in­dek­su w Py­tho­nie, bo ozna­cza tam ostat­ni ele­ment listy.
Wy­szu­ki­wa­nie bi­nar­ne wymaga upo­rząd­ko­wa­nej listy. Po­rów­nu­je war­tość środ­ko­wą i od­rzu­ca połowę za­kre­su, w której wynik nie może się znaj­do­wać. Dla ro­sną­cej listy 2, 4, 6, 8, 10, 12, 14 i war­to­ści 12 naj­pierw po­rów­nu­je 8. Szu­ka­na jest więk­sza, więc po­zo­sta­ją 10, 12, 14; ko­lej­ne po­rów­na­nie 12 daje tra­fie­nie.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
def znajdz_binarnie(dane, szukana):
lewy, prawy = 0, len(dane) - 1
while lewy <= prawy:
srodek = (lewy + prawy) // 2
if dane[srodek] == szukana:
return srodek
if dane[srodek] < szukana:
lewy = srodek + 1
else:
prawy = srodek - 1
return -1
print(znajdz_binarnie([2, 4, 6, 8, 10, 12, 14], 12))
Wynik to 5. Ope­ra­tor po­dwój­ne­go uko­śni­ka wy­ko­nu­je dzie­le­nie cał­ko­wi­te w dół. Gra­ni­ce prze­su­wa­ją się poza spraw­dzo­ny środek, dla­te­go zakres maleje. Po­zo­sta­wie­nie tej samej gra­ni­cy może pro­wa­dzić do nie­skoń­czo­nej pętli. Na nie­upo­rząd­ko­wa­nej liście od­rzu­ca­na połowa mo­gła­by za­wie­rać szu­ka­ną war­tość, więc gwa­ran­cja po­praw­no­ści znika.

Sor­to­wa­nie i liczba ope­ra­cji

Sor­to­wa­nie to upo­rząd­ko­wa­nie ele­men­tów według przy­ję­tej re­la­cji, na przy­kład ro­sną­cych cen. Sor­to­wa­nie bą­bel­ko­we po­rów­nu­je są­sia­dów i za­mie­nia ich miej­sca­mi, gdy są w złej ko­lej­no­ści. Po pełnym prze­bie­gu naj­więk­szy ele­ment roz­pa­try­wa­ne­go za­kre­su znaj­du­je się na końcu. Na­stęp­ny prze­bieg może więc ominąć tę koń­co­wą po­zy­cję.
1
2
3
4
5
6
dane = [5, 2, 4, 1]
for koniec in range(len(dane) - 1, 0, -1):
for i in range(koniec):
if dane[i] > dane[i + 1]:
dane[i], dane[i + 1] = dane[i + 1], dane[i]
print(dane)
Wynik to lista [1, 2, 4, 5]. W pierw­szym prze­bie­gu ko­lej­ne za­mia­ny dają [2, 5, 4, 1], [2, 4, 5, 1] i [2, 4, 1, 5]. Pierw­szy prze­bieg nie sor­tu­je całej listy: usta­wia na końcu 5. Rów­no­le­głe przy­pi­sa­nie w Py­tho­nie za­mie­nia war­to­ści bez ich utraty. Przy zwy­kłym nad­pi­sa­niu jednej ko­mór­ki przed od­czy­tem dru­giej po­trzeb­na byłaby zmien­na po­moc­ni­cza.
Po­rzą­dek ro­sną­cy do­pusz­cza równe są­sia­du­ją­ce war­to­ści. W po­ka­za­nej wersji za­mie­nia­my ele­men­ty tylko wtedy, gdy lewy jest więk­szy, więc ele­men­ty równe nie za­mie­nia­ją się bez­po­śred­nio miej­sca­mi. Przy po­rząd­ko­wa­niu re­kor­dów według ceny może mieć zna­cze­nie za­cho­wa­nie wcze­śniej­szej ko­lej­no­ści pro­duk­tów o tej samej cenie. Taką wła­sność nazywa się sta­bil­no­ścią sor­to­wa­nia. Sam po­praw­ny po­rzą­dek war­to­ści nie do­wo­dzi sta­bil­no­ści. W zwy­kłym py­ta­niu o liczby wy­star­czy wy­zna­czyć ko­lej­ność, ale przy re­kor­dach trzeba od­czy­tać, co po­le­ce­nie mówi o rów­nych klu­czach.
Liczba po­rów­nań opi­su­je koszt dzia­ła­nia nie­za­leż­nie od szyb­ko­ści kon­kret­ne­go kom­pu­te­ra. Wy­szu­ki­wa­nie li­nio­we może przej­rzeć wszyst­kie n ele­men­tów. Bi­nar­ne po ko­lej­nych po­dzia­łach po­trze­bu­je liczby kroków ro­sną­cej lo­ga­ryt­micz­nie. Prosta wersja sor­to­wa­nia bą­bel­ko­we­go wy­ko­nu­je około n razy n po­rów­nań dla dużych n. Zapis O(n), O(log n) i O(n²) opi­su­je tempo wzro­stu kosztu, a nie do­kład­ny czas w se­kun­dach. Prze­bie­gi sor­to­wań po­rów­nu­je wi­zu­ali­za­cja al­go­ryt­mów.

Re­ku­ren­cja i za­koń­cze­nie

Re­ku­ren­cja to roz­wią­za­nie, w którym funk­cja wy­wo­łu­je samą siebie dla mniej­sze­go lub prost­sze­go przy­pad­ku. Musi ist­nieć przy­pa­dek bazowy koń­czą­cy wy­wo­ła­nia oraz krok pro­wa­dzą­cy w jego stronę. Silnia liczby n to ilo­czyn liczb od 1 do n, przy czym silnia zera wynosi 1. Przyj­mu­je­my wy­łącz­nie nie­ujem­ne liczby cał­ko­wi­te.
1
2
3
4
5
6
7
def silnia(n):
if n == 0:
return 1
return n * silnia(n - 1)
print(silnia(4))
Wynik to 24. Wy­wo­ła­nia scho­dzą przez 4, 3, 2, 1 do 0, a na­stęp­nie zwra­ca­ją wyniki 1, 1, 2, 6 i 24. Bez przy­pad­ku ba­zo­we­go wy­wo­ła­nia nie koń­czy­ły­by się po­praw­nie. Dla ujem­ne­go wej­ścia od­li­cza­nie w dół także nie osią­gnie zera. To po­ka­zu­je zna­cze­nie za­ło­że­nia o do­pusz­czal­nym wej­ściu. Dla dużych danych trzeba do­dat­ko­wo uwzględ­nić ogra­ni­cze­nie głę­bo­ko­ści wy­wo­łań śro­do­wi­ska.

Na eg­za­mi­nie

Przy sche­ma­cie za­cznij od wej­ścia i idź po za­zna­czo­nych przej­ściach. Przy pętli policz do­kład­ne in­dek­sy, a przy re­ku­ren­cji roz­pisz zej­ście do przy­pad­ku ba­zo­we­go oraz powrót. Nie utoż­sa­miaj jed­ne­go prze­bie­gu sor­to­wa­nia z pełnym wy­ni­kiem. Przy wy­szu­ki­wa­niu bi­nar­nym sprawdź wy­ma­ga­ne upo­rząd­ko­wa­nie i sposób li­cze­nia po­zy­cji.
Pu­łap­ka: al­go­rytm może dawać dobry wynik dla jed­ne­go przy­kła­du, a nadal być błędny. Pusta lista, po­wtó­rze­nia i war­to­ści gra­nicz­ne spraw­dza­ją inne ścież­ki.
W prak­ty­ce naj­pierw zapisz ocze­ki­wa­ne wyniki krót­kich przy­kła­dów, a potem uru­chom kod. Skład­nię od­po­wied­nie­go języka opi­su­ją działy JS i PHP. Ten etap ma po­twier­dzić sposób roz­wią­za­nia, nie­za­leż­nie od miej­sca jego póź­niej­sze­go użycia.

Ściąga

Po­ję­cie
Wa­ru­nek lub dzia­ła­nie
spe­cy­fi­ka­cja
wej­ście, wynik, za­ło­że­nia
romb
de­cy­zja z pod­pi­sa­ny­mi wyj­ścia­mi
rów­no­le­gło­bok
wej­ście lub wyj­ście
li­nio­we
ko­lej­ne ele­men­ty, bez wymogu sor­to­wa­nia
bi­nar­ne
upo­rząd­ko­wa­na lista, od­rzu­ca­nie połowy
bą­bel­ko­we
po­rów­na­nie i za­mia­na są­sia­dów
re­ku­ren­cja
przy­pa­dek bazowy i coraz prost­szy ar­gu­ment
test gra­nicz­ny
pusta lista, jeden ele­ment, równe war­to­ści
Pobierz ściągę PDF
ZAWODNIK
egzamin zawodowy INF.02 · INF.03 · INF.04
Serwer Discord›
Egzaminy zawodowe IT/Matury/Studia
@yastor
© 2026 Zawodnik · by Yastor
Arkusze i zasady oceniania pochodzą z CKE. Serwis nie jest powiązany z Centralną Komisją Egzaminacyjną.