Sortowanie liczb

Sortowanie liczb – od prostych list do plików tekstowych w Pythonie

Wyobraź sobie, że masz kilkanaście liczb zapisanych w przypadkowej kolejności. Chcesz znaleźć najmniejszą liczbę, największą wartość albo przygotować ranking wyników. Możesz sprawdzać każdą liczbę osobno, ale znacznie wygodniej będzie najpierw je uporządkować. Właśnie temu służy sortowanie danych.

1. Na czym polega sortowanie?

Sortowanie to proces porządkowania danych według określonej zasady, nazywanej kryterium sortowania. Możemy sortować liczby, teksty, daty, ceny produktów, wyniki zawodów i wiele innych informacji.

Najczęściej spotykamy dwa sposoby sortowania liczb:

  • Sortowanie rosnące – od najmniejszej wartości do największej.
  • Sortowanie malejące – od największej wartości do najmniejszej.

Przykład: mamy liczby 8, 3, 12, 1, 6.

  • Przed sortowaniem: 8, 3, 12, 1, 6
  • Po sortowaniu rosnącym: 1, 3, 6, 8, 12
  • Po sortowaniu malejącym: 12, 8, 6, 3, 1

Ważne: sortowanie nie zmienia wartości liczb. Zmienia jedynie ich kolejność.

2. Gdzie spotykamy sortowanie w codziennym życiu?

Sortowanie jest jedną z najczęściej wykorzystywanych operacji w informatyce, ale spotykamy je również poza komputerami.

  • Sklep internetowy – wyświetlanie produktów od najtańszego do najdroższego.
  • Szkoła – uporządkowanie wyników sprawdzianu według liczby zdobytych punktów.
  • Sport – przygotowanie rankingu zawodników od najlepszego wyniku.
  • Biblioteka – ustawianie książek alfabetycznie według nazwiska autora.
  • Galeria zdjęć – sortowanie fotografii według daty wykonania.
  • Magazyn – uporządkowanie produktów według ilości dostępnych sztuk.
  • Komputer – sortowanie plików według nazwy, rozmiaru lub daty modyfikacji.

Każde sortowanie wymaga ustalenia kryterium. Przykładowo produkty można uporządkować według ceny, nazwy lub daty dodania. Te same dane mogą więc występować w różnych kolejnościach.

3. Sortowanie liczb w Pythonie

Python posiada gotowe narzędzia do sortowania. Najprostszym z nich jest metoda sort(), która porządkuje elementy listy.

Przykład 1. Sortowanie rosnące

Tworzymy listę zawierającą pięć liczb, a następnie sortujemy ją od najmniejszej do największej.

liczby = [8, 3, 12, 1, 6]

liczby.sort()

print(liczby)

Wynik działania programu: [1, 3, 6, 8, 12].

Metoda sort() zmienia kolejność elementów bezpośrednio w istniejącej liście.

Przykład 2. Sortowanie malejące

Jeżeli chcemy uporządkować liczby od największej do najmniejszej, wykorzystujemy parametr reverse=True.

punkty = [45, 82, 67, 91, 38]

punkty.sort(reverse=True)

print(punkty)

Wynik: [91, 82, 67, 45, 38].

Takie sortowanie przydaje się podczas przygotowywania rankingów, w których najwyższy wynik powinien znajdować się na początku listy.

Przykład 3. Sortowanie bez zmiany oryginalnej listy

Czasami potrzebujemy zachować pierwotną kolejność danych. Przykładowo wyniki uczniów mogą być zapisane według numerów w dzienniku, a my chcemy dodatkowo utworzyć ranking.

Możemy wtedy wykorzystać funkcję sorted().

wyniki = [70, 45, 90, 60, 80]

ranking = sorted(wyniki, reverse=True)

print(wyniki)

print(ranking)

Oryginalna lista pozostanie bez zmian: [70, 45, 90, 60, 80].

Nowa lista będzie zawierała ranking: [90, 80, 70, 60, 45].

Zapamiętaj: metoda sort() zmienia istniejącą listę, natomiast funkcja sorted() zwraca nową, uporządkowaną listę.

4. Sortowanie liczb podanych przez użytkownika

W poprzednich przykładach liczby były zapisane bezpośrednio w programie. Możemy jednak przygotować program, w którym użytkownik sam podaje wartości.

Program powinien:

  1. Utworzyć pustą listę.
  2. Pobrać od użytkownika pięć liczb.
  3. Dodać każdą liczbę do listy.
  4. Posortować listę rosnąco.
  5. Wyświetlić wynik.

Przykładowy program:

liczby = []

for i in range(5):

    liczba = int(input("Podaj liczbę: "))

    liczby.append(liczba)

liczby.sort()

print(liczby)

Instrukcja int() zamienia wprowadzony tekst na liczbę całkowitą. Metoda append() dodaje kolejny element na koniec listy.

5. Jak komputer może samodzielnie sortować liczby?

Dotychczas korzystaliśmy z gotowych funkcji Pythona. Warto jednak zrozumieć, w jaki sposób można samodzielnie uporządkować liczby.

Jedną z najprostszych metod jest sortowanie bąbelkowe (ang. bubble sort).

Algorytm polega na wielokrotnym porównywaniu dwóch sąsiednich elementów. Jeżeli znajdują się w niewłaściwej kolejności, zamieniamy je miejscami.

Przykład sortowania bąbelkowego

Mamy liczby: 5, 2, 8, 1.

  1. Porównujemy 5 i 2. Ponieważ 5 jest większe od 2, zamieniamy liczby. Otrzymujemy: 2, 5, 8, 1.
  2. Porównujemy 5 i 8. Kolejność jest poprawna, więc niczego nie zmieniamy.
  3. Porównujemy 8 i 1. Zamieniamy liczby. Otrzymujemy: 2, 5, 1, 8.
  4. Rozpoczynamy kolejne przejście. Porównujemy 2 i 5, a następnie 5 i 1. Po zamianie otrzymujemy: 2, 1, 5, 8.
  5. W kolejnym przejściu zamieniamy 2 i 1. Ostatecznie otrzymujemy: 1, 2, 5, 8.

Po każdym pełnym przejściu największa liczba z jeszcze nieuporządkowanej części listy trafia na właściwe miejsce.

Sortowanie bąbelkowe jest łatwe do zrozumienia, ale przy dużych zbiorach danych zwykle działa znacznie wolniej niż algorytmy wykorzystywane przez gotowane funkcje sortujące Pythona.

6. Sortowanie liczb zapisanych w pliku tekstowym

W praktyce dane nie zawsze znajdują się bezpośrednio w programie. Bardzo często są przechowywane w plikach tekstowych, bazach danych lub innych źródłach.

W edytorze Python na stronie ai.robotech.edu.pl/python.html dostępny jest wirtualny plik dane.txt. Możemy wykorzystać go do ćwiczeń z odczytywania i sortowania liczb.

Przykładowa zawartość pliku dane.txt

W pliku zapisano następujące liczby, każdą w osobnym wierszu:

124

456

789

224

556

12

991

Naszym zadaniem jest odczytanie liczb z pliku, uporządkowanie ich rosnąco i wyświetlenie wyniku.

Przykład 4. Odczytywanie liczb z pliku

Przy standardowej obsłudze plików tekstowych w Pythonie możemy wykorzystać instrukcję open().

liczby = []

with open("dane.txt", "r") as plik:

    for wiersz in plik:

        liczby.append(int(wiersz.strip()))

print(liczby)

Program otwiera plik do odczytu, pobiera kolejne wiersze, usuwa zbędne białe znaki i zamienia zapis tekstowy na liczbę całkowitą.

Instrukcja strip() usuwa białe znaki z początku i końca tekstu, w tym znak końca wiersza.

Przykład 5. Sortowanie danych z pliku

Rozbudowujemy poprzedni program o sortowanie rosnące.

liczby = []

with open("dane.txt", "r") as plik:

    for wiersz in plik:

        liczby.append(int(wiersz.strip()))

liczby.sort()

print(liczby)

Oczekiwany wynik: [12, 124, 224, 456, 556, 789, 991].

W ten sposób połączyliśmy trzy operacje: odczyt danych, przetwarzanie danych oraz wyświetlenie wyniku.

7. Zapis posortowanych liczb do nowego pliku

W kolejnym kroku możemy zapisać uporządkowane liczby do nowego pliku posortowane.txt, pozostawiając oryginalny plik dane.txt bez zmian.

liczby = []

with open("dane.txt", "r") as plik:

    for wiersz in plik:

        liczby.append(int(wiersz.strip()))

liczby.sort()

with open("posortowane.txt", "w") as plik:

    for liczba in liczby:

        plik.write(str(liczba) + "
")

print("Zapisano posortowane liczby.")

Warto zwrócić uwagę na trzy elementy:

  • "r" oznacza otwarcie pliku do odczytu.
  • "w" oznacza otwarcie pliku do zapisu. Jeżeli plik już istnieje, jego dotychczasowa zawartość zostanie zastąpiona.
  • str(liczba) zamienia liczbę na tekst, który można zapisać do pliku.

Znak
oznacza przejście do nowego wiersza.

8. Dlaczego typ danych ma znaczenie podczas sortowania?

Plik tekstowy przechowuje znaki. Odczytując z niego liczbę, początkowo otrzymujemy tekst, a nie wartość liczbową.

To ważne, ponieważ Python inaczej sortuje liczby, a inaczej napisy.

Przykładowe dane: 3, 20, 100, 8.

  • Sortowanie liczb rosnąco: 3, 8, 20, 100.
  • Sortowanie tych samych wartości jako tekstów: 100, 20, 3, 8.

Podczas sortowania tekstu porównywane są kolejne znaki, dlatego napis „100” znajduje się przed napisem „20”.

Wniosek: jeżeli chcemy sortować liczby odczytane z pliku tekstowego, należy wcześniej zamienić je na typ liczbowy, np. za pomocą int() lub float().

9. Zadania do samodzielnego wykonania

Wykonaj poniższe ćwiczenia w edytorze Python. Zacznij od najłatwiejszych i stopniowo przechodź do trudniejszych.

  1. Zadanie 1 – Łatwe. Utwórz listę zawierającą 10 dowolnych liczb. Posortuj ją rosnąco i wyświetl wynik.
  2. Zadanie 2 – Łatwe. Zmodyfikuj poprzedni program, aby liczby były sortowane malejąco.
  3. Zadanie 3 – Łatwe. Utwórz listę wyników pięciu zawodników. Wyświetl ranking od najlepszego do najsłabszego wyniku, nie zmieniając oryginalnej listy.
  4. Zadanie 4 – Średnie. Napisz program pobierający od użytkownika pięć liczb. Posortuj je rosnąco i wyświetl największą oraz najmniejszą wartość.
  5. Zadanie 5 – Średnie. Odczytaj liczby z pliku dane.txt i wyświetl je w kolejności rosnącej.
  6. Zadanie 6 – Średnie. Zmodyfikuj program tak, aby liczby z pliku były wyświetlane malejąco.
  7. Zadanie 7 – Trudniejsze. Posortuj liczby z pliku dane.txt i zapisz wynik do nowego pliku posortowane.txt.
  8. Zadanie 8 – Trudniejsze. Przygotuj ranking wyników z pliku. Wyświetl największą liczbę, najmniejszą liczbę, sumę oraz średnią arytmetyczną.
  9. Zadanie 9 – Zaawansowane. Napisz własny algorytm sortowania bąbelkowego bez używania sort() i sorted().
  10. Zadanie 10 – Zaawansowane. Odczytaj liczby z pliku, posortuj je własnym algorytmem i zapisz wynik do nowego pliku tekstowego.

10. Podsumowanie – co należy zapamiętać?

  • Sortowanie polega na uporządkowaniu danych według określonego kryterium.
  • Sortowanie rosnące porządkuje liczby od najmniejszej do największej.
  • Sortowanie malejące porządkuje liczby od największej do najmniejszej.
  • Metoda sort() sortuje istniejącą listę i zmienia kolejność jej elementów.
  • Funkcja sorted() tworzy nową posortowaną listę.
  • Parametr reverse=True umożliwia sortowanie malejące.
  • Sortowanie bąbelkowe polega na porównywaniu sąsiednich elementów i zamienianiu ich miejscami.
  • Dane odczytane z pliku tekstowego należy zamienić na liczby, jeżeli chcemy sortować je numerycznie.
  • Program może odczytać dane z pliku, posortować je i zapisać wynik do nowego pliku.

Najważniejszy wniosek: sortowanie jest jednym z podstawowych sposobów przetwarzania danych. Ułatwia wyszukiwanie informacji, przygotowywanie rankingów, analizowanie wyników i organizowanie dużych zbiorów danych. W Pythonie możemy korzystać zarówno z gotowych funkcji sortujących, jak i samodzielnie tworzyć algorytmy porządkowania danych.