A következő algoritmus mit csinál? Fontos!
Mit csinál a következő algoritmus az A[1:n] tömbbel, amelyben különböző egész számokat tárolunk? Az informatikában kevésbé járatosak számára is érthető, szöveges választ várunk!
Eljárás MitCsinál(A[1:n])
i=1
Ciklus j=2-től n-ig
Ha A[1]>A[j] akkor
i=i+1
Csere(A[j],A[i])
Elágazás vége
Ciklus vége
Csere(A[1],A[i])
Eljárás vége
Amit nem csinál: biztosan nem azt hajtja végre, amit a kitalálója szeretne, mert a program hibás.
Amit csinál: A1 és An felcserélődik. Mindentől függetlenül. Más nem történik.
A #2 megjegyzést talán eleve bele kellett volna írni a kérdésbe. Mindenki jobban járt volna.
Tehát a program hibás, az első és utolsó elemet felcseréli. De a hiba mindig az eredeti céltól függ, mert hiba nem létezik önmagában, csak a célhoz képest.
Ha a cél a nagyság szerint növekvő sorba rendezés,akkor másképp hibás, mintha csökkenő sorba. És másképp, ha még más a feladat.
Vagyis ha a tanár CSAK annyit mondott, hogy az eljárás hibás, és erről mindent mondjunk el, arra az a korrekt válasz, hogy a hiba az, hogy az első és utolsó elem cseréjét sokkal egyszerűbben is meg lehet oldani. A hiba további elemzése viszont a feladattól függ.
#4-nek teljesen igaza van sok mindenben, amit írt. (Abban nincs igaza, hogy az első és utolsó elemet cseréli fel az algoritmus, hisz i nem megy el n-ig.)
Az látszik, hogy a program vagy teljesen hibás, vagy közel sem teljes, és mivel nem tudjuk, mi lenne a feladata, csak találgatni lehet a célját. Gondolhatnánk akár kártyakeverésre is, de leginkább a gyorsrendezésre (quicksort) hasonlít. Ha tényleg azt akarja megvalósítani, akkor "csupán" az a hibája, hogy nincs meghíva a végén rekurzívan a tömb két részének (1..i-1 és i+1..n) rendezése. Ha viszont meg lenne híva, akkor hiányozna az elejéről a rekurzió leállító feltétel is, illetve akkor sok mindent máshogy kellene benne csinálni (nem 1-től n-ig kellene a tömböt kezelni, hanem ez a két index is bemenő paraméter kellene legyen mondjuk).
Maga a rutin egyébként annyit csinál, hogy két részre osztja a tömböt: 1-től i-1 indexig vannak azok az elemek, amik kisebbek az i-edik elemnél (ami induláskor a legelső volt), i+1 és n között pedig a nála nagyobbak vannak.
Kicsit részletesebben fogalmazva: A tömb első eleme lesz a gyorsrendezés "pivot" eleme (támpontnak szokták talán magyarra fordítani), és a pivot-nál kisebbeket a tömb elejére rakja, a nagyobbakat pedig a végére. A végén az utolsó 'Csere' hívással a pivot elemet magát berakja a két rész közé.
Technikailag ebben a működésben nincs hiba, de elég sokat kellene még faragni a rutinon, hogy igazi gyorsrendezés legyen belőle.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!