R12192efrJ5bH
Grafika przedstawia dwa splecione symbole węży. Jeden jest niebieski, a drugi żółty.

Porządkowanie w Pythonie

Logo języka Python
Źródło: Dnu72, dostępny w internecie: commons.wikimedia.org, licencja: CC BY-SA 4.0.
bg‑gray4

Treści zawarte w tym e‑materiale wykraczają poza podstawę programową. Jeśli jednak:

  • interesujesz się informatyką i programowaniem,

  • chcesz poszerzyć swoją wiedzę i umiejętności rozwiązywania problemów w języku Python,

  • poznać inne metody sortowania

zachęcamy cię do zapoznania się z tym e‑materiałem.

Codzienność wymaga skutecznego wyszukiwania i przyswajania informacji. Problemem jednak jest ilość danych, do których mamy dostęp, a także ich niedostateczne uporządkowanie. Jednym z podstawowych sposobów przetwarzania dużej liczby danych jest ich sortowanie. Dane uporządkowane względem jakiejś cechy, np. niemalejąco lub alfabetycznie, są łatwiejsze do przeszukania. W jednym z poprzednich materiałów poznaliśmy już algorytm sortowania przez wybieranie. W tym materiale zajmiemy się metodą porządkowania przez zliczanie.

Zliczanie ocen

Policzymy, ile poszczególnych ocen otrzymał uczeń w trakcie roku szkolnego. Wyniki przedstawimy w postaci listy (liczby wystąpień danej oceny) oraz listy uporządkowanych ocen.

Jak zrealizować takie zadanie przy użyciu kartki i długopisu? Najprostsza metoda polega na przeglądaniu kolejnych ocen i ich zliczaniu. Zliczanie może polegać na stawianiu kresek pod etykietami ocen, ale to wymagało będzie późniejszego ich policzenia. Możemy też zapisywać kolejną liczbę wystąpień danej oceny pod etykietą. Poniżej przykład wykorzystujący ten drugi sposób.

Przykład 1

Przeanalizujmy zliczanie liczb. Chcemy zliczyć każde wystąpienie danej liczby z listy ocen:

oceny = [3, 2, 3, 1, 6, 4, 5, 4, 2, 5]

Przygotowujemy listę liczników, która posłuży nam do zliczania wystąpień ocen. Oceny będą indeksami liczników. Liczniki mają wartość zero.

Oceny = Indeksy

1

2

3

4

5

6

Liczniki

0

0

0

0

0

0

Przeglądamy kolejne oceny i zwiększamy liczniki:

Indeksy liczników

Krok

Ocena

1

2

3

4

5

6

1

3

1

2

2

1

3

3

2

4

1

1

5

6

1

6

4

1

7

5

1

8

4

2

9

2

2

10

5

2

Liczniki:

1

2

2

2

2

1

Otrzymujemy listę, którą uzupełniamy o licznik zero, mimo że nie mamy takiej oceny. Robimy tak, ponieważ będziemy chcieli zapisać ten algorytm w postaci programu w języku Python. Do przechowywania ocen oraz liczników wykorzystamy listy, a one są indeksowane od 0:

liczniki = [0, 1, 2, 2, 2, 2, 1]

Teraz przeglądamy listę, zaczynając od drugiego elementu i sumujemy wartości aktualnego i poprzedzającego licznika. Uzyskaną sumę zapisujemy w aktualnym liczniku. W kolejnych krokach lista będzie wyglądała następująco.

Operacja: liczniki[1] = liczniki[1] + liczniki[0] = 1 + 0 = 1

Linia 1. indeksy znak równości otwórz nawias kwadratowy 0 przecinek 1 przecinek 2 przecinek 3 przecinek 4 przecinek 5 przecinek 6 zamknij nawias kwadratowy. Linia 2. liczniki znak równości otwórz nawias kwadratowy 0 przecinek 1 przecinek 2 przecinek 2 przecinek 2 przecinek 2 przecinek 1 zamknij nawias kwadratowy.

Operacja: liczniki[2] = liczniki[2] + liczniki[1] = 2 + 1 = 3

Linia 1. indeksy znak równości otwórz nawias kwadratowy 0 przecinek 1 przecinek 2 przecinek 3 przecinek 4 przecinek 5 przecinek 6 zamknij nawias kwadratowy. Linia 2. liczniki znak równości otwórz nawias kwadratowy 0 przecinek 1 przecinek 3 przecinek 2 przecinek 2 przecinek 2 przecinek 1 zamknij nawias kwadratowy.

Operacja: liczniki[3] = liczniki[3] + liczniki[2] = 2 + 3 = 5

Linia 1. indeksy znak równości otwórz nawias kwadratowy 0 przecinek 1 przecinek 2 przecinek 3 przecinek 4 przecinek 5 przecinek 6 zamknij nawias kwadratowy. Linia 2. liczniki znak równości otwórz nawias kwadratowy 0 przecinek 1 przecinek 3 przecinek 5 przecinek 2 przecinek 2 przecinek 1 zamknij nawias kwadratowy.

Operacja: liczniki[4] = liczniki[4] + liczniki[3] = 2 + 5 = 7

Linia 1. indeksy znak równości otwórz nawias kwadratowy 0 przecinek 1 przecinek 2 przecinek 3 przecinek 4 przecinek 5 przecinek 6 zamknij nawias kwadratowy. Linia 2. liczniki znak równości otwórz nawias kwadratowy 0 przecinek 1 przecinek 3 przecinek 5 przecinek 7 przecinek 2 przecinek 1 zamknij nawias kwadratowy.

Operacja: liczniki[5] = liczniki[5] + liczniki[4] = 2 + 7 = 9

Linia 1. indeksy znak równości otwórz nawias kwadratowy 0 przecinek 1 przecinek 2 przecinek 3 przecinek 4 przecinek 5 przecinek 6 zamknij nawias kwadratowy. Linia 2. liczniki znak równości otwórz nawias kwadratowy 0 przecinek 1 przecinek 3 przecinek 5 przecinek 7 przecinek 9 przecinek 1 zamknij nawias kwadratowy.

Operacja: liczniki[6] = liczniki[6] + liczniki[5] = 1 + 9 = 10

Linia 1. indeksy znak równości otwórz nawias kwadratowy 0 przecinek 1 przecinek 2 przecinek 3 przecinek 4 przecinek 5 przecinek 6 zamknij nawias kwadratowy. Linia 2. liczniki znak równości otwórz nawias kwadratowy 0 przecinek 1 przecinek 3 przecinek 5 przecinek 7 przecinek 9 przecinek 10 zamknij nawias kwadratowy.

W ten sposób zliczyliśmy liczniki.

Zliczenie liczników to jednak nie koniec. Konieczne jest posortowanie elementów na podstawie zliczonych liczników.

Przykład 2

Obliczone wartości liczników pomniejszone o 1 wyznaczą ostatnią pozycję, na której należy umieścić porządkowaną wartość wskazywaną przez indeks licznika. Warto również zauważyć, że różnice między sąsiednimi licznikami informują, ile ocen należy umieścić w liście posortowanej.

Np. różnica między licznikiem o wartości 10, a licznikiem go poprzedzającym (o wartości 9) wynosi 1, co oznacza, że ocena 6 wystąpiła raz i powinna zostać umieszczona na pozycji (indeksie) 10 - 1, tj. na pozycji o indeksie w liście posortowanej.

Przed przystąpieniem do sortowania przygotowujemy listę dla posortowanych ocen, która będzie zawierała tyle samo elementów, co pierwotna lista ocen.

Linia 1. oceny znak równości otwórz nawias kwadratowy 3 przecinek 2 przecinek 3 przecinek 1 przecinek 6 przecinek 4 przecinek 5 przecinek 4 przecinek 2 przecinek 5 zamknij nawias kwadratowy. Linia 2. liczniki znak równości otwórz nawias kwadratowy 0 przecinek 1 przecinek 3 przecinek 5 przecinek 7 przecinek 9 przecinek 10 zamknij nawias kwadratowy. Linia 3. posortowane znak równości otwórz nawias kwadratowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 zamknij nawias kwadratowy.

Zaczynamy przeglądać listę ocen od końca. Ostatnią oceną jest ocena 5. Ocenę wykorzystujemy jako indeks, za pomocą którego odczytujemy licznik z listy liczników: liczniki[5] = 9. Uzyskana wartość pomniejszona o 1 wskazuje pozycję (indeks), na której umieszczamy ocenę w liście posortowanej: posortowane[9 - 1] = 5. Następnie zmniejszamy wartość licznika, aby wskazywał pozycję dla ewentualnej następnej takiej samej oceny: liczniki[5] -= 1. W kolejnym kroku otrzymujemy następujące listy:

Linia 1. oceny znak równości otwórz nawias kwadratowy 3 przecinek 2 przecinek 3 przecinek 1 przecinek 6 przecinek 4 przecinek 5 przecinek 4 przecinek 2 przecinek 5 zamknij nawias kwadratowy. Linia 2. liczniki znak równości otwórz nawias kwadratowy 0 przecinek 1 przecinek 3 przecinek 5 przecinek 7 przecinek otwórz nawias ostrokątny strong zamknij nawias ostrokątny 8 otwórz nawias ostrokątny prawy ukośnik strong zamknij nawias ostrokątny przecinek 10 zamknij nawias kwadratowy. Linia 3. posortowane znak równości otwórz nawias kwadratowy 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek otwórz nawias ostrokątny strong zamknij nawias ostrokątny 5 otwórz nawias ostrokątny prawy ukośnik strong zamknij nawias ostrokątny przecinek 0 zamknij nawias kwadratowy.

Operację powtarzamy dla następnej oceny od końca, tj. 2. W kolejnym kroku listy przyjmą postać:

Linia 1. oceny znak równości otwórz nawias kwadratowy 3 przecinek 2 przecinek 3 przecinek 1 przecinek 6 przecinek 4 przecinek 5 przecinek 4 przecinek 2 przecinek 5 zamknij nawias kwadratowy. Linia 2. liczniki znak równości otwórz nawias kwadratowy 0 przecinek 1 przecinek otwórz nawias ostrokątny strong zamknij nawias ostrokątny 2 otwórz nawias ostrokątny prawy ukośnik strong zamknij nawias ostrokątny przecinek 5 przecinek 7 przecinek 8 przecinek 10 zamknij nawias kwadratowy. Linia 3. posortowane znak równości otwórz nawias kwadratowy 0 przecinek 0 przecinek otwórz nawias ostrokątny strong zamknij nawias ostrokątny 2 otwórz nawias ostrokątny prawy ukośnik strong zamknij nawias ostrokątny przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 0 przecinek 5 przecinek 0 zamknij nawias kwadratowy.

Po odczytaniu wszystkich ocen otrzymujemy uporządkowaną listę:

Indeksy

0

1

2

3

4

5

6

7

8

9

Oceny

1

2

2

3

3

4

4

5

5

6

Algorytm porządkowania metodą przez zliczanie

Napiszemy program, który uporządkuje w sposób niemalejący listę ocen z wykorzystaniem algorytmu porządkowania metodą przez zliczanie.

Algorytm porządkowania metodą przez zliczanie nadaje się do sortowania liczb całkowitych z dowolnego przedziału, w tym materiale podajemy specyfikację oraz implementację, zakładając, że porządkujemy liczby naturalne większe od 0.

Specyfikacja algorytmu:

Dane wejściowe:

  • oceny – lista ocen z zakresu <1;6>

  • n – dodatnia liczba naturalna, liczba ocen

Wynik:

  • liczniki – lista zawierająca liczby wystąpień poszczególnych ocen

  • posortowane – lista uporządkowanych niemalejąco ocen

Zmienne pomocnicze:

  • ocena – liczba naturalna z zakresu <1;6> – kolejne oceny z listy

  • liczba_licznikow – liczba naturalna, liczba liczników

  • i – liczba naturalna, indeks elementów listy

Zapiszemy algorytm w postaci listy kroków.

  1. Do liczba_licznikow przypisz wartość max(oceny) + 1.

  2. Utwórz listę liczniki zawierającą liczba_licznikow wartości 0.

  3. Dla każdego elementu ocena listy oceny wykonaj:

    3.1. Zwiększ wartość liczniki[ocena]1.

  4. Wypisz listę liczniki.

  5. Dla elementów listy liczniki o indeksach i od 1 do liczba_licznikow - 1 wykonaj:

    5.1. Zwiększ wartość liczniki[i] o wartość liczniki[i - 1].

  6. Utwórz listę posortowane zawierającą n wartości 0.

  7. Dla elementów listy oceny o indeksach i od n - 1 do 0 wykonaj:

    7.1. Zmiennej ocena przypisz wartość oceny[i].

    7.2. Zmiennej licznik przypisz wartość liczniki[ocena].

    7.3. Zmiennej posortowane[licznik - 1] przypisz wartość ocena.

    7.4. Zmniejsz wartość liczniki[ocena]1.

  8. Wypisz listę posortowane.

W algorytmie można wyróżnić kilka operacji:

  1. Zliczanie – indeksy elementów listy liczniki odpowiadają zliczanym wartościom, w tym wypadku ocenom. Np. w elemencie liczniki[1] będą zliczane oceny 1. Indeks ostatniego elementu musi być więc równy maksymalnej zliczanej wartości – max(oceny), a liczba elementów listy liczniki musi być większa o 1, ponieważ pierwszy element listy ma indeks 0. Dodatkowo początkowe wartości liczników muszą równać się 0. Z każdym wystąpieniem danej oceny, odpowiedni indeks listy liczniki będzie zwiększany o 1.

  2. Sumowanie – po zliczeniu sumujemy wartości licznika i licznika go poprzedzającego, zaczynając od licznika o indeksie 1, wynik zastępuje dotychczasową wartość licznika.

  3. Porządkowanie – odczytujemy z listy oceny zaczynając od ostatniej, z listy liczników odczytujemy wartość indeksu wskazaną przez ocenę, ocenę wstawiamy do listy posortowane pod odczytanym indeksem pomniejszonym o jeden, indeks w liście liczników pomniejszamy o 1 i przechodzimy do kolejnej oceny.

Implementacja programu

Napiszemy teraz program, który zrealizuje opisany algorytm.

Do pisania programu użyj dostępnego w swoim środowisku edytora, np. IDLE dołączonego do standardowej instalacji Pythona.

Zaczniemy od kodu, w którym podamy listę ocen i ich liczbę.

Linia 1. oceny znak równości otwórz nawias kwadratowy 3 przecinek 2 przecinek 3 przecinek 1 przecinek 6 przecinek 4 przecinek 5 przecinek 4 przecinek 2 przecinek 5 zamknij nawias kwadratowy. Linia 2. n znak równości 10. Linia 3. print otwórz nawias okrągły cudzysłów Oceny dwukropek cudzysłów przecinek oceny zamknij nawias okrągły.

Jeżeli liczba ocen nie będzie dana z góry, można ją wyznaczyć za pomocą funkcji len(), która zwraca liczbę elementów listy, np.:

Linia 1. n znak równości len otwórz nawias okrągły oceny zamknij nawias okrągły.

Zliczanie ocen

Do zliczania użyjemy listy, której indeksy odpowiadają zliczanym wartościom. Każdy element listy – licznik – zainicjujemy wartością 0. Zadanie takie realizuje się zazwyczaj w pętli. W języku Python możliwe jest również użycie następującej instrukcji:

Linia 1. lista znak równości otwórz nawias kwadratowy wartość zamknij nawias kwadratowy asterysk liczba.

gdzie [wartość] oznacza pojedynczy element powielony w liście, a liczba określa, ile razy element [wartość] zostanie umieszczony na liście.

Polecenie 1

Wykonaj podane niżej polecenia w trybie interaktywnym interpretera Pythona (np. w IDLE) i odpowiedz na pytania.

Linia 1. liczby znak równości otwórz nawias kwadratowy 9 przecinek 4 przecinek 8 przecinek 4 przecinek 5 zamknij nawias kwadratowy. Linia 2. liczniki znak równości otwórz nawias kwadratowy 0 zamknij nawias kwadratowy asterysk otwórz nawias okrągły max otwórz nawias okrągły liczby zamknij nawias okrągły plus 1 zamknij nawias okrągły. Linia 3. liczniki. Linia 4. len otwórz nawias okrągły liczniki zamknij nawias okrągły. Linia 5. liczniki otwórz nawias kwadratowy 4 zamknij nawias kwadratowy plus znak równości 1. Linia 6. liczniki otwórz nawias kwadratowy 4 zamknij nawias kwadratowy plus znak równości 1. Linia 7. liczniki.
RNazzRhk7ilrq

Długość listy liczniki zależy od maksymalnej zliczanej wartości. Powyżej użyliśmy wbudowanej instrukcji max(), ale w implementacji użyjemy następującej funkcji:

Linia 1. def znajdz podkreślnik maks otwórz nawias okrągły lista zamknij nawias okrągły dwukropek. Linia 2. maks podkreślnik e znak równości lista otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 3. for i in range otwórz nawias okrągły 1 przecinek n zamknij nawias okrągły dwukropek. Linia 4. if lista otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias ostrokątny maks podkreślnik e dwukropek. Linia 5. maks podkreślnik e znak równości lista otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 6. return maks podkreślnik e.
Ważne!

Zakres w pętli for wykorzystuje zmienną n, czyli liczbę ocen, która została zdefiniowana globalnie poza funkcją znajdz_maks (w sekcji „Implementacja programu”). Użycie zmiennej n jest tutaj możliwe, ponieważ Python automatycznie przeszukuje zakresy, aby znaleźć zmienną o danej nazwie. Jeśli nie znajdzie jej w lokalnym zakresie (wewnątrz zdefiniowanej funkcji), sprawdzi globalny zakres (w całym programie).

Liczba liczników musi być większa o 1 od wartości zwróconej przez funkcję znajdz_maks(), ponieważ indeksy listy zaczynają się od 0.

1
Polecenie 2

W programie umieść poniższe instrukcje:

Linia 1. def znajdz podkreślnik maks otwórz nawias okrągły lista zamknij nawias okrągły dwukropek. Linia 2. maks podkreślnik e znak równości lista otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 3. for i in range otwórz nawias okrągły 1 przecinek n zamknij nawias okrągły dwukropek. Linia 4. if lista otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias ostrokątny maks podkreślnik e dwukropek. Linia 5. maks podkreślnik e znak równości lista otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 6. return maks podkreślnik e. Linia 8. oceny znak równości otwórz nawias kwadratowy 3 przecinek 2 przecinek 3 przecinek 1 przecinek 6 przecinek 4 przecinek 5 przecinek 4 przecinek 2 przecinek 5 zamknij nawias kwadratowy. Linia 9. n znak równości 10. Linia 10. print otwórz nawias okrągły cudzysłów Oceny dwukropek cudzysłów przecinek oceny zamknij nawias okrągły. Linia 12. kratka przygotowanie listy liczników. Linia 13. liczba podkreślnik licznikow znak równości znajdz podkreślnik maks otwórz nawias okrągły oceny zamknij nawias okrągły plus 1. Linia 14. liczniki znak równości liczba podkreślnik licznikow asterysk otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 15. print otwórz nawias okrągły cudzysłów Lista liczniki po zainicjowaniu dwukropek cudzysłów przecinek liczniki zamknij nawias okrągły.

Pamiętaj, aby definicję funkcji znajdz_maks umieścić na początku programu (jest to zgodne z dobrymi praktykami).

Polecenie 3

Na końcu programu dodaj instrukcję iterującą po ocenach i zwiększającą licznik oceny w liście liczników. Po wykonaniu operacji zliczania wypisz listę liczniki.

Ważne!

Zliczanie polega na przeglądaniu ocen w pętli i inkrementacjiinkrementacjainkrementacji wskazanego przez ocenę elementu listy liczników o 1.

Użyj instrukcji for i funkcji print().

Następną operacją jest zaktualizowanie listy liczniki według zasady, że wartość licznika zastępowana jest jego wartością powiększoną o wartość licznika poprzedniego. W pętli for za pomocą funkcji range() generujemy indeksy od 1 do liczba_licznikow - 1, tj. 6. Wewnątrz pętli zwiększamy wartości liczników.

1
Polecenie 4

Do programu dopisz kod:

Linia 1. kratka sumowanie liczników. Linia 2. for i in range otwórz nawias okrągły 1 przecinek liczba podkreślnik licznikow zamknij nawias okrągły dwukropek. Linia 3. liczniki otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości liczniki otwórz nawias kwadratowy i zamknij nawias kwadratowy plus liczniki otwórz nawias kwadratowy i minus 1 zamknij nawias kwadratowy. Linia 4. print otwórz nawias okrągły cudzysłów Zawartość listy liczniki po zsumowaniu liczby wystąpień wcześniejszych ocen dwukropek cudzysłów przecinek liczniki zamknij nawias okrągły.

Porządkowanie ocen

Rozpoczynamy od przygotowania listy dla posortowanych ocen, której elementy inicjujemy wartością 0. Listę nazwiemy posortowane. Wykorzystujemy podobny kod, jak w przypadku listy liczniki. Do programu dopisujemy:

Linia 1. kratka lista dla posortowanych ocen. Linia 2. posortowane znak równości n asterysk otwórz nawias kwadratowy 0 zamknij nawias kwadratowy.

Następnie w pętli for przeglądamy listę oceny zaczynając od końca. Instrukcja range(n - 1, -1, -1) zwraca liczby od wartości - 1, czyli indeksu ostatniego elementu listy ocen, do wartości 0 – indeksu pierwszej oceny, z krokiem -1.

Do programu dopisujemy:

Linia 1. kratka sortowanie ocen. Linia 2. for i in range otwórz nawias okrągły n minus 1 przecinek minus 1 przecinek minus 1 zamknij nawias okrągły dwukropek. Linia 3. ocena znak równości oceny otwórz nawias kwadratowy i zamknij nawias kwadratowy.

W kolejnym kroku za pomocą zmiennej pomocniczejzmienna pomocniczazmiennej pomocniczej ocena odczytujemy licznik, tj liczbę wystąpień tej oceny w liście oceny: licznik = liczniki[ocena]. Wartość licznika pomniejszona o jeden jest indeksem, pod którym umieszczamy ocenę w liście posortowanych ocen: posortowane[licznik - 1] = ocena. Na koniec dekrementujemydekrementacjadekrementujemy wartość licznika: liczniki[ocena] -= 1, aby można było wyznaczyć pozycję, na której należy umieścić kolejną taką samą ocenę.

Kod realizujący opisane operacje dopisujemy do instrukcji wykonywanych w omawianej pętli for. Po wykonaniu pętli wypisujemy listę posortowanych ocen:

Linia 1. kratka sortowanie ocen. Linia 2. for i in range otwórz nawias okrągły n minus 1 przecinek minus 1 przecinek minus 1 zamknij nawias okrągły dwukropek. Linia 3. ocena znak równości oceny otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 4. licznik znak równości liczniki otwórz nawias kwadratowy ocena zamknij nawias kwadratowy. Linia 5. posortowane otwórz nawias kwadratowy licznik minus 1 zamknij nawias kwadratowy znak równości ocena. Linia 6. liczniki otwórz nawias kwadratowy ocena zamknij nawias kwadratowy minus znak równości 1. Linia 8. print otwórz nawias okrągły cudzysłów Posortowane dwukropek cudzysłów przecinek posortowane zamknij nawias okrągły.

Pełny kod programu:

Linia 1. def znajdz podkreślnik maks otwórz nawias okrągły lista zamknij nawias okrągły dwukropek. Linia 2. maks podkreślnik e znak równości lista otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 3. for i in range otwórz nawias okrągły 1 przecinek n zamknij nawias okrągły dwukropek. Linia 4. if lista otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias ostrokątny maks podkreślnik e dwukropek. Linia 5. maks podkreślnik e znak równości lista otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 6. return maks podkreślnik e. Linia 8. oceny znak równości otwórz nawias kwadratowy 3 przecinek 2 przecinek 3 przecinek 1 przecinek 6 przecinek 4 przecinek 5 przecinek 4 przecinek 2 przecinek 5 zamknij nawias kwadratowy. Linia 9. n znak równości 10. Linia 10. print otwórz nawias okrągły cudzysłów Oceny dwukropek cudzysłów przecinek oceny zamknij nawias okrągły. Linia 12. kratka przygotowanie listy liczników. Linia 13. liczba podkreślnik licznikow znak równości znajdz podkreślnik maks otwórz nawias okrągły oceny zamknij nawias okrągły plus 1. Linia 14. liczniki znak równości liczba podkreślnik licznikow asterysk otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 15. print otwórz nawias okrągły cudzysłów Lista liczniki po zainicjowaniu dwukropek cudzysłów przecinek liczniki zamknij nawias okrągły. Linia 17. kratka zliczanie ocen. Linia 18. for ocena in oceny dwukropek. Linia 19. liczniki otwórz nawias kwadratowy ocena zamknij nawias kwadratowy plus znak równości 1 kratka inkrementacja o 1. Linia 20. print otwórz nawias okrągły cudzysłów Liczniki – lista zawierająca liczby wystąpień poszczególnych ocen dwukropek cudzysłów przecinek liczniki zamknij nawias okrągły. Linia 22. kratka sumowanie liczników. Linia 23. for i in range otwórz nawias okrągły 1 przecinek liczba podkreślnik licznikow zamknij nawias okrągły dwukropek. Linia 24. liczniki otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości liczniki otwórz nawias kwadratowy i zamknij nawias kwadratowy plus liczniki otwórz nawias kwadratowy i minus 1 zamknij nawias kwadratowy. Linia 25. print otwórz nawias okrągły cudzysłów Zawartość listy liczniki po zsumowaniu liczby wystąpień wcześniejszych ocen dwukropek cudzysłów przecinek liczniki zamknij nawias okrągły. Linia 26. kratka lista dla posortowanych ocen. Linia 27. posortowane znak równości n asterysk otwórz nawias kwadratowy 0 zamknij nawias kwadratowy. Linia 29. kratka sortowanie ocen. Linia 30. for i in range otwórz nawias okrągły n minus 1 przecinek minus 1 przecinek minus 1 zamknij nawias okrągły dwukropek. Linia 31. ocena znak równości oceny otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 32. licznik znak równości liczniki otwórz nawias kwadratowy ocena zamknij nawias kwadratowy. Linia 33. posortowane otwórz nawias kwadratowy licznik minus 1 zamknij nawias kwadratowy znak równości ocena. Linia 34. liczniki otwórz nawias kwadratowy ocena zamknij nawias kwadratowy minus znak równości 1. Linia 36. print otwórz nawias okrągły cudzysłów Posortowane dwukropek cudzysłów przecinek posortowane zamknij nawias okrągły.
1
Polecenie 5

Uruchom program i przeanalizuj wyniki jego działania.

Ważne!

Po uruchomieniu programu wyświetlone zostaną trzy zawartości listy liczniki. Druga z nich (wyświetlana za pomocą instrukcji z linii 20) to lista wynikowa, pozostałe dwie pozwalają ci przeanalizować działanie programu i jego poprawność.

Ważne!

O niektórych algorytmach sortowania możemy powiedzieć, że są stabilne. Oznacza to, że w przypadku tych algorytmów utrzymana jest kolejność występowania elementów o tej samej wartości klucza (cechy, według której odbywa się sortowanie). Ma to znaczenie w sytuacji, kiedy element poza kluczem, według którego sortujemy, zawiera również inne informacje.

Przykład 3

Dane są pary liczb:

Linia 1. otwórz nawias kwadratowy otwórz nawias okrągły 3 przecinek 1 zamknij nawias okrągły przecinek otwórz nawias okrągły 2 przecinek 2 zamknij nawias okrągły przecinek otwórz nawias okrągły 3 przecinek 3 zamknij nawias okrągły przecinek otwórz nawias okrągły 1 przecinek 4 zamknij nawias okrągły przecinek otwórz nawias okrągły 2 przecinek 5 zamknij nawias okrągły zamknij nawias kwadratowy.

Naszym zadaniem jest posortowanie ich niemalejąco według pierwszego elementu każdej pary.

Wynik sortowania algorytmem stabilnym:

Linia 1. otwórz nawias kwadratowy otwórz nawias okrągły 1 przecinek 4 zamknij nawias okrągły przecinek otwórz nawias okrągły 2 przecinek 2 zamknij nawias okrągły przecinek otwórz nawias okrągły 2 przecinek 5 zamknij nawias okrągły przecinek otwórz nawias okrągły 3 przecinek 1 zamknij nawias okrągły przecinek otwórz nawias okrągły 3 przecinek 3 zamknij nawias okrągły zamknij nawias kwadratowy.

Zwróć uwagę na pary (2, 2)(2, 5) oraz (3, 1)(3, 3). W liście wejściowej para (2, 2) znajdowała się przed (2, 5), a (3, 1) przed (3, 3). Zostało to zachowane w liście wynikowej.

Notatnik

RzG9VAbZzRb1S
Miejsce na Twoje notatki: (Uzupełnij) .

Gra edukacyjna

R1PFLZNR15MVZ
Polecenie 6

Zagraj w grę, następnie odpowiedz na pytanie.

R5N3Y2USeAU2R
Wskaż, któremu etapowi algorytmu porządkowania przez zliczanie odpowiada pierwszy etap gry.
Polecenie 7

Należy posortować bombki choinkowe, których rozmiary oznaczono liczbami: [9,3,9,3,7,3,7,5]. Przyjmij, że koszom z gry odpowiada lista liczników w algorytmie sortowania przez zliczanie. Podaj zawartość listy liczników po zliczeniu bombek.

Przykład

Zestaw bombek: [6,4,2,4,2,8,6]

Lista liczników po zliczeniu: [0,0,2,2,4,4,6,6,7]

R1bHg3jjrsVPy
Wpisz listę bez nawiasów kwadratowych pamiętając, że znakiem oddzielającym jej elementy jest przecinek i spacja.
3

Zestaw ćwiczeń interaktywnych

RAaYSC9uRGCWC
Ćwiczenie 1
Uporządkuj operacje wykonywane w algorytmie porządkowania metodą przez zliczanie.
R1aRfLxpSeYAF
Ćwiczenie 2
Zaznacz poprawną odpowiedź.
Do zakodowania algorytmu porządkowania metodą przez zliczanie użyjesz: Możliwe odpowiedzi: 1. instrukcji pobierania, 2. kilku pętli for, 3. instrukcji warunkowej, 4. instrukcji dodającej elementy do listy
Źródło: Robert Bednarz, licencja: CC BY 3.0.
R1O6KxP2rHrpr
Ćwiczenie 3
Uzupełnij tekst.
R12mPiNaMh2m8
Ćwiczenie 4
Zaznacz poprawną odpowiedź.
Do przygotowania liczników dla wartości z zakresu <0;10> użyjesz instrukcji: Możliwe odpowiedzi: 1. liczniki = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 2. text=liczniki = 10 * (0), 3. liczniki = 11 * [0], 4. liczniki = 11 * [0]
Źródło: Robert Bednarz, licencja: CC BY 3.0.
R1IAGvz7UTGF7
Ćwiczenie 5
Zaznacz pętle wykorzystywane w algorytmie porządkowania przez zliczanie omówionym w tym materiale.
RWWJqBUJxAnmz
Ćwiczenie 6
Zaznacz poprawną odpowiedź.
Lista liczników po zsumowaniu indeksów wygląda następująco: [0, 1, 4, 4, 6, 8, 11, 13, 13, 14]. Ile liczb o wartości 8 jest w porządkowanej liście? Możliwe odpowiedzi: 1. listę liczników należy przeglądać od końca, 2. wartości trzeba zliczać od najmniejszej, 3. trzeba dodać operację porównywania
Źródło: Robert Bednarz, licencja: CC BY 3.0.
R1ADXniXImFPA
Ćwiczenie 7
Uzupełnij odpowiednimi instrukcjami brakujące pola w operacjach wykonywanych w pętli porządkującej sortowane wartości.
11
Ćwiczenie 8

Specyfikacja problemu:

Dane wejściowe:

  • nieposortowane – lista zawierająca nieposortowane liczby

Wyniki:

  • Wypisana lista liczb uporządkowanych w sposób niemalejący przy użyciu metody przez zliczanie.

Ćwiczenie wykonaj testerce.

R14dZhd7Bfk091
4

Słownik

dekrementacja
dekrementacja

oznacza zmniejszanie wartości zmiennej o 1

inkrementacja
inkrementacja

oznacza zwiększenie wartości zmiennej o 1

zmienna pomocnicza
zmienna pomocnicza

zmienna tymczasowo przechowująca pośredni wynik obliczeń lub jakąś wartość