{"id":"informatyka-2016-maj-matura-rozszerzona/zad/2.1","paper_id":"informatyka-2016-maj-matura-rozszerzona","number":"2.1","points":2,"ptype":"closed","subject":"informatyka","category":"matura","year":2016,"month":"maj","level":"rozszerzona","text":"Zadanie 2.1. (0-2)\nDana jest liczba n = 6 oraz tablica A = [4,6,3,5,2,1]. Podaj kolejność elementów w tablicy A\npo wykonaniu funkcji przestaw(A).\nMiejsce na obliczenia.\nOdp. A =\nMIN_1R","answer":"A","answer_text":"Zadanie 2.1. (0-2)\nIII. Rozwiązywanie problemów i\npodejmowanie decyzji […], z zastosowaniem\npodejścia algorytmicznego.\n5. Rozwiązywanie problemów i podejmowanie\ndecyzji […], stosowanie podejścia algorytmicznego.\nZdający:\n2) stosuje podejście algorytmiczne do rozwiązywania\nproblemu;\n7) opracowuje i przeprowadza wszystkie etapy\nprowadzące do otrzymania poprawnego rozwiązania\nproblemu: od sformułowania specyfikacji problemu\npo testowanie rozwiązania;\n11) opisuje podstawowe algorytmy i stosuje: […]\nb) algorytmy wyszukiwania i porządkowania\n(sortowania);\n17) Zdający ocenia zgodność algorytmu ze\nspecyfikacją problemu.\nSchemat punktowania\n2 p. - za poprawną odpowiedź.\n0 p. - za odpowiedź błędną albo brak odpowiedzi.\nPoprawna odpowiedź\nA=[3,2,1,5,6,4]\nUwaga: Nie przyznaje się 1 p.","solution":"## Poprawna odpowiedź\n\n**A = [3, 2, 1, 5, 6, 4]**\n\n## Sposób 1 - symulacja krok po kroku\n\n**Stan początkowy:** A = [4, 6, 3, 5, 2, 1], n = 6.\n- klucz ← A[1] = **4**\n- w ← 1\n\nFunkcja iteruje k od 2 do 6. Gdy A[k] < klucz (4), wykonuje zamień(A[w], A[k]) i inkrementuje w.\n\n| k | A[k] | A[k] < 4? | Akcja | w przed | Stan A po | w po |\n| 2 | 6 | NIE | - | 1 | [4,6,3,5,2,1] | 1 |\n| 3 | 3 | TAK | zamień(A[1], A[3]) | 1 | [**3**,6,**4**,5,2,1] | 2 |\n| 4 | 5 | NIE | - | 2 | [3,6,4,5,2,1] | 2 |\n| 5 | 2 | TAK | zamień(A[2], A[5]) | 2 | [3,**2**,4,5,**6**,1] | 3 |\n| 6 | 1 | TAK | zamień(A[3], A[6]) | 3 | [3,2,**1**,5,6,**4**] | 4 |\n\n**Stan końcowy: A = [3, 2, 1, 5, 6, 4]** ✓\n\n## Sposób 2 - weryfikacja warunku partycji\n\nKlucz to **4** (wartość początkowa A[1]). Po wykonaniu funkcji oczekujemy:\n- W lewej części wszystkie wartości **< 4**: w wyniku [3, 2, 1] (indeksy 1-3) - wszystkie < 4 ✓\n- W prawej części wartości **≥ 4**: [5, 6, 4] (indeksy 4-6) - wszystkie ≥ 4 ✓\n\nIndeks granicy `w` na końcu = 4 → pozycja pierwszego elementu prawej części.\n\nW lewej części znajdują się WSZYSTKIE 3 elementy z A mniejsze od 4 (czyli 3, 2, 1). Pozostałe (6, 5, oraz sam klucz 4) są w prawej części, ale w innej kolejności niż początkowo - bo zostały przesunięte przez kolejne `zamień`.\n\n## Sposób 3 - implementacja Python (do weryfikacji)\n\n```python\ndef przestaw(A):\nn = len(A)\nklucz = A[0] # A[1] przy indeksowaniu od 1 = A[0] w Pythonie\nw = 0\nfor k in range(1, n):\nif A[k] < klucz:\nA[w], A[k] = A[k], A[w]\nw += 1\nreturn A\n\nA = [4, 6, 3, 5, 2, 1]\nprint(przestaw(A)) # [3, 2, 1, 5, 6, 4]\n\n## Reference informatyczny - partycja Lomuto\n\n> Reference - Algorytm partycji (Lomuto):\n> - Algorytm `przestaw` to **wariant partycji Lomuto** używanej w quicksort.\n> - Idea: indeks `w` wskazuje pierwszą pozycję w \"prawej\" części. Wszystko PRZED `w` to elementy mniejsze od klucza.\n> - **Klasyczna wersja Lomuto** używa ostatniego elementu jako pivot; tutaj klucz to pierwszy element, więc partycja nie kończy się umieszczeniem klucza na właściwej pozycji.\n> - **Złożoność**: O(n) - jedno przejście przez tablicę.\n> - **Niestabilność**: elementy równe i większe od klucza mogą zmienić kolejność (np. tu 6 i 5 wymieszały się z kluczem 4).\n\n## Schemat oceniania CKE\n\n> Klucz CKE (zadanie 2.1, max 2 pkt):\n> - **2 pkt** - poprawna odpowiedź A = [3, 2, 1, 5, 6, 4]\n> - **0 pkt** - odpowiedź błędna albo brak\n>\n> **Uwaga: NIE PRZYZNAJE SIĘ 1 punktu** - odpowiedź musi być w pełni poprawna.\n\n## Typowe pułapki\n\n- **Mylenie kierunku porównania** - `A[k] < klucz` (ostro mniejszy, nie ≤). Element równy kluczowi trafia do prawej części.\n- **Inkrementacja `w` przy braku zamiany** - `w` rośnie TYLKO po wykonaniu zamiany.\n- **Inicjalizacja w = 0 lub w = 2** - poprawne to **w = 1** (start od miejsca klucza A[1]).\n- **Iteracja od k = 1** zamiast k = 2 - wtedy klucz zamieniłby się ze sobą.\n- **Pomyłka z indeksowaniem od 0** w Pythonie/C++ vs od 1 w pseudokodzie CKE.\n- **Pomyłka w stanie tablicy** po zamianach - łatwo pomylić, który element gdzie powędrował. Najlepiej rysować tablicę po każdej iteracji.\n\n## Złożoność obliczeniowa\n\n- Pętla iteruje od k = 2 do n: **O(n)** iteracji.\n- W każdej iteracji stały koszt: porównanie, ewentualna zamiana (3 przypisania), inkrementacja.\n- **Łączna złożoność: O(n)** czas, **O(1)** pamięć dodatkowa (in-place).","image":"img/informatyka-2016-maj-matura-rozszerzona/zad-2.1.webp","solution_image":null,"topics":null,"page_from":4,"source":"ocr","answer_source":"ocr","answer_text_source":"ocr","solution_source":"maturazai","text_source":"ocr","source_label":"Informatyka · Matura · maj 2016 (rozszerzona)","subject_label":"Informatyka","category_label":"Matura","text_html":"<p>Zadanie 2.1. (0-2)<br>Dana jest liczba n = 6 oraz tablica A = [4,6,3,5,2,1]. Podaj kolejność elementów w tablicy A<br>po wykonaniu funkcji przestaw(A).<br>Miejsce na obliczenia.<br>Odp. A =<br>MIN_1R</p>","answer_text_html":"<p>Zadanie 2.1. (0-2)<br>III. Rozwiązywanie problemów i<br>podejmowanie decyzji […], z zastosowaniem<br>podejścia algorytmicznego.</p>\n<ol><li>Rozwiązywanie problemów i podejmowanie</li></ol>\n<p>decyzji […], stosowanie podejścia algorytmicznego.<br>Zdający:</p>\n<ol><li>stosuje podejście algorytmiczne do rozwiązywania</li></ol>\n<p>problemu;</p>\n<ol><li>opracowuje i przeprowadza wszystkie etapy</li></ol>\n<p>prowadzące do otrzymania poprawnego rozwiązania<br>problemu: od sformułowania specyfikacji problemu<br>po testowanie rozwiązania;</p>\n<ol><li>opisuje podstawowe algorytmy i stosuje: […]</li></ol>\n<p>b) algorytmy wyszukiwania i porządkowania<br>(sortowania);</p>\n<ol><li>Zdający ocenia zgodność algorytmu ze</li></ol>\n<p>specyfikacją problemu.<br>Schemat punktowania<br>2 p. - za poprawną odpowiedź.<br>0 p. - za odpowiedź błędną albo brak odpowiedzi.<br>Poprawna odpowiedź<br>A=[3,2,1,5,6,4]<br>Uwaga: Nie przyznaje się 1 p.</p>","solutions":[{"source":"maturazai","label":"maturazai.pl (AI)","kind":"text","html":"<h4>Poprawna odpowiedź</h4>\n<p><strong>A = [3, 2, 1, 5, 6, 4]</strong></p>\n<h4>Sposób 1 - symulacja krok po kroku</h4>\n<p><strong>Stan początkowy:</strong> A = [4, 6, 3, 5, 2, 1], n = 6.</p>\n<ul><li>klucz ← A[1] = <strong>4</strong></li><li>w ← 1</li></ul>\n<p>Funkcja iteruje k od 2 do 6. Gdy A[k] &lt; klucz (4), wykonuje zamień(A[w], A[k]) i inkrementuje w.</p>\n<p>| k | A[k] | A[k] &lt; 4? | Akcja | w przed | Stan A po | w po |<br>| 2 | 6 | NIE | - | 1 | [4,6,3,5,2,1] | 1 |<br>| 3 | 3 | TAK | zamień(A[1], A[3]) | 1 | [<strong>3</strong>,6,<strong>4</strong>,5,2,1] | 2 |<br>| 4 | 5 | NIE | - | 2 | [3,6,4,5,2,1] | 2 |<br>| 5 | 2 | TAK | zamień(A[2], A[5]) | 2 | [3,<strong>2</strong>,4,5,<strong>6</strong>,1] | 3 |<br>| 6 | 1 | TAK | zamień(A[3], A[6]) | 3 | [3,2,<strong>1</strong>,5,6,<strong>4</strong>] | 4 |</p>\n<p><strong>Stan końcowy: A = [3, 2, 1, 5, 6, 4]</strong> ✓</p>\n<h4>Sposób 2 - weryfikacja warunku partycji</h4>\n<p>Klucz to <strong>4</strong> (wartość początkowa A[1]). Po wykonaniu funkcji oczekujemy:</p>\n<ul><li>W lewej części wszystkie wartości <strong>&lt; 4</strong>: w wyniku [3, 2, 1] (indeksy 1-3) - wszystkie &lt; 4 ✓</li><li>W prawej części wartości <strong>≥ 4</strong>: [5, 6, 4] (indeksy 4-6) - wszystkie ≥ 4 ✓</li></ul>\n<p>Indeks granicy <code>w</code> na końcu = 4 → pozycja pierwszego elementu prawej części.</p>\n<p>W lewej części znajdują się WSZYSTKIE 3 elementy z A mniejsze od 4 (czyli 3, 2, 1). Pozostałe (6, 5, oraz sam klucz 4) są w prawej części, ale w innej kolejności niż początkowo - bo zostały przesunięte przez kolejne <code>zamień</code>.</p>\n<h4>Sposób 3 - implementacja Python (do weryfikacji)</h4>\n<p>```python<br>def przestaw(A):<br>n = len(A)<br>klucz = A[0] # A[1] przy indeksowaniu od 1 = A[0] w Pythonie<br>w = 0<br>for k in range(1, n):<br>if A[k] &lt; klucz:<br>A[w], A[k] = A[k], A[w]<br>w += 1<br>return A</p>\n<p>A = [4, 6, 3, 5, 2, 1]<br>print(przestaw(A)) # [3, 2, 1, 5, 6, 4]</p>\n<h4>Reference informatyczny - partycja Lomuto</h4>\n<blockquote>Reference - Algorytm partycji (Lomuto):<br>- Algorytm <code>przestaw</code> to <strong>wariant partycji Lomuto</strong> używanej w quicksort.<br>- Idea: indeks <code>w</code> wskazuje pierwszą pozycję w &quot;prawej&quot; części. Wszystko PRZED <code>w</code> to elementy mniejsze od klucza.<br>- <strong>Klasyczna wersja Lomuto</strong> używa ostatniego elementu jako pivot; tutaj klucz to pierwszy element, więc partycja nie kończy się umieszczeniem klucza na właściwej pozycji.<br>- <strong>Złożoność</strong>: O(n) - jedno przejście przez tablicę.<br>- <strong>Niestabilność</strong>: elementy równe i większe od klucza mogą zmienić kolejność (np. tu 6 i 5 wymieszały się z kluczem 4).</blockquote>\n<h4>Schemat oceniania CKE</h4>\n<blockquote>Klucz CKE (zadanie 2.1, max 2 pkt):<br>- <strong>2 pkt</strong> - poprawna odpowiedź A = [3, 2, 1, 5, 6, 4]<br>- <strong>0 pkt</strong> - odpowiedź błędna albo brak<br><br><strong>Uwaga: NIE PRZYZNAJE SIĘ 1 punktu</strong> - odpowiedź musi być w pełni poprawna.</blockquote>\n<h4>Typowe pułapki</h4>\n<ul><li><strong>Mylenie kierunku porównania</strong> - <code>A[k] &lt; klucz</code> (ostro mniejszy, nie ≤). Element równy kluczowi trafia do prawej części.</li><li><strong>Inkrementacja <code>w</code> przy braku zamiany</strong> - <code>w</code> rośnie TYLKO po wykonaniu zamiany.</li><li><strong>Inicjalizacja w = 0 lub w = 2</strong> - poprawne to <strong>w = 1</strong> (start od miejsca klucza A[1]).</li><li><strong>Iteracja od k = 1</strong> zamiast k = 2 - wtedy klucz zamieniłby się ze sobą.</li><li><strong>Pomyłka z indeksowaniem od 0</strong> w Pythonie/C++ vs od 1 w pseudokodzie CKE.</li><li><strong>Pomyłka w stanie tablicy</strong> po zamianach - łatwo pomylić, który element gdzie powędrował. Najlepiej rysować tablicę po każdej iteracji.</li></ul>\n<h4>Złożoność obliczeniowa</h4>\n<ul><li>Pętla iteruje od k = 2 do n: <strong>O(n)</strong> iteracji.</li><li>W każdej iteracji stały koszt: porównanie, ewentualna zamiana (3 przypisania), inkrementacja.</li><li><strong>Łączna złożoność: O(n)</strong> czas, <strong>O(1)</strong> pamięć dodatkowa (in-place).</li></ul>"}]}