Technikum Klasa II 45 minut PP: II.1+I.2c | s. 342-343

Lekcja 3: Programowanie algorytmow sortowania - utrwalenie

Implementacja i porownanie algorytmow sortowania w Pythonie

📋 Podstawa programowa: II.1+I.2c
Pythonalgorytmyimplementacjamerge sortprogramowaniequick sortsortowanieutrwalenie
00:00
Wprowadzenie
5 min
00:05
Teoria
15 min
00:20
Cwiczenia
15 min
00:35
Podsumowanie
10 min
📚

Teoria

Dlaczego sortowanie jest wazne?

Sortowanie to jeden z najczesciej uzywanych algorytmow w informatyce. Posortowane dane pozwalaja na szybkie wyszukiwanie, latwiejsza analize i czytelna prezentacje. W klasie I poznalismy kilka algorytmow - teraz utrwalamy ich implementacje w Pythonie.

Sortowanie babelkowe (Bubble Sort)

Porownujemy sasiednie elementy i zamieniamy je, jesli sa w zlej kolejnosci. Powtarzamy przejscia az lista bedzie posortowana:

def sortowanie_babelkowe(tab):
    n = len(tab)
    for i in range(n - 1):
        zamiana = False
        for j in range(n - 1 - i):
            if tab[j] > tab[j + 1]:
                tab[j], tab[j + 1] = tab[j + 1], tab[j]
                zamiana = True
        if not zamiana:  # optymalizacja - wczesne zakonczenie
            break
    return tab

Zlozonosc: O(n^2) w najgorszym przypadku, O(n) w najlepszym (juz posortowana).

Sortowanie przez wstawianie (Insertion Sort)

Budujemy posortowana czesc listy, wstawiajac kazdy kolejny element na wlasciwe miejsce:

def sortowanie_przez_wstawianie(tab):
    for i in range(1, len(tab)):
        klucz = tab[i]
        j = i - 1
        while j >= 0 and tab[j] > klucz:
            tab[j + 1] = tab[j]
            j -= 1
        tab[j + 1] = klucz
    return tab

Zlozonosc: O(n^2) w najgorszym przypadku, O(n) w najlepszym. Efektywne dla malych zbiorow danych.

Sortowanie przez wybor (Selection Sort)

W kazdym kroku znajdujemy minimum z nieposortowanej czesci i umieszczamy je na poczatku:

def sortowanie_przez_wybor(tab):
    n = len(tab)
    for i in range(n - 1):
        min_idx = i
        for j in range(i + 1, n):
            if tab[j] < tab[min_idx]:
                min_idx = j
        tab[i], tab[min_idx] = tab[min_idx], tab[i]
    return tab

Zlozonosc: O(n^2) zawsze - niezaleznie od ukladu danych.

Porownanie algorytmow: Sortowanie babelkowe i przez wstawianie dzialaja dobrze na malych lub niemal posortowanych danych. Sortowanie przez wybor ma stala zlozonosc O(n^2), ale wykonuje mniej zamian. W praktyce Python uzywa algorytmu Timsort (hybrydowy), ktory ma zlozonosc O(n log n).
✏️

Zadania

Latwe

Zadanie 1: Implementacja i test

Zaimplementuj wszystkie trzy algorytmy sortowania z teorii. Przetestuj kazdy na tej samej liscie: [64, 34, 25, 12, 22, 11, 90]. Wyswietl liste po kazdym przejsciu, aby zobaczyc jak algorytm dziala krok po kroku.

Pokaz przykladowe rozwiazanie
def babelkowe_verbose(tab):
    tab = tab.copy()
    n = len(tab)
    for i in range(n - 1):
        for j in range(n - 1 - i):
            if tab[j] > tab[j + 1]:
                tab[j], tab[j + 1] = tab[j + 1], tab[j]
        print(f"  Przejscie {i+1}: {tab}")
    return tab

dane = [64, 34, 25, 12, 22, 11, 90]
print("Sortowanie babelkowe:")
wynik = babelkowe_verbose(dane)
print(f"  Wynik: {wynik}")
Srednie

Zadanie 2: Porownanie czasu

Uzyj modulu time, aby zmierzyc czas dzialania kazdego algorytmu na losowej liscie 1000, 5000 i 10000 elementow. Porownaj wyniki z wbudowana funkcja sorted(). Przedstaw wyniki w tabeli.

Pokaz przykladowe rozwiazanie
import time
import random

def zmierz_czas(funkcja, dane):
    kopia = dane.copy()
    start = time.time()
    funkcja(kopia)
    return time.time() - start

for rozmiar in [1000, 5000, 10000]:
    dane = [random.randint(1, 100000) for _ in range(rozmiar)]
    print(f"\nRozmiar: {rozmiar}")
    print(f"  Babelkowe:       {zmierz_czas(sortowanie_babelkowe, dane):.4f}s")
    print(f"  Przez wstawianie:{zmierz_czas(sortowanie_przez_wstawianie, dane):.4f}s")
    print(f"  Przez wybor:     {zmierz_czas(sortowanie_przez_wybor, dane):.4f}s")
    print(f"  sorted():        {zmierz_czas(sorted, dane):.6f}s")
Srednie

Zadanie 3: Sortowanie malejaco

Zmodyfikuj kazdy z trzech algorytmow sortowania tak, aby sortowal malejaco (od najwiekszego do najmniejszego). Dodaj parametr malejaco=False do kazdej funkcji, ktory zmienia kierunek sortowania.

Trudne

Zadanie 4: Licznik operacji

Zmodyfikuj kazdy algorytm tak, aby zliczal liczbe porownan i zamian. Porownaj te wartosci dla listy posortowanej rosnaco, malejaco i losowej (kazda po 100 elementow). Ktory algorytm wykonuje najmniej operacji w kazdym przypadku?

🎥

Materialy wideo

15 Sorting Algorithms in 6 Minutes - wizualizacja
Timo Bingmann
Algorytmy sortowania - Bubble, Selection, Insertion Sort
CS50
🎧

Podcasty

✔️

Quiz - sprawdz sie!

📜

Podstawa programowa

← Lekcja 2: Struktury danych Lekcja 4: Algorytmy tekstowe →