Porządkowanie w Pythonie
Z porządkowaniem spotykamy się każdego dnia. Porządkujemy rzeczy i nawet nie zastanawiamy się, jak to robimy, np. układając w szufladzie kolejne miseczki, umieszczając mniejszą w większej, a tę większą następnie w jeszcze większej itd.
Również systemy informatyczne wykorzystują często tę operację – nazywamy ją sortowaniem. Posortowana jest np. lista kontaktów w telefonie – niezależnie od tego, w jakiej kolejności dodawaliśmy kontakty, możemy wyświetlać je posortowane alfabetycznie (sortowanie zgodnie z porządkiem liter alfabetu nazywamy porządkiem leksykograficznym).
Dużo łatwiej jest nam korzystać z danych uporządkowanych. Komputery do sortowania danych używają różnych algorytmów. W tym materiale zapoznamy się z algorytmem porządkowania metodą przez wybieranie.
Porządkujemy karty
Dana jest talia 24 kart, w której hierarchia kart przedstawia się następująco: 9, 10, W, D, K, A (dziewiątka, dziesiątka, walet, dama, król, as). Przyjmijmy, że po rozdaniu mamy w ręce kilka nieuporządkowanych kart. Chcemy uporządkować je od najmłodszej (o najmniejszej wartości) do najstarszej (o największej wartości), czyli niemalejąco. Możemy przyjąć następującą strategię:
Szukamy najmniejszej karty i zamieniamy ją z kartą pierwszą.
Spośród pozostałych kart wybieramy najmniejszą i zamieniamy z kartą drugą.
Kroki 1 oraz 2 powtarzamy dla wszystkich kart. Po ich wykonaniu karty są posortowane.
Przeanalizujmy przykład.
Przeanalizujmy porządkowanie kart niemalejąco za pomocą algorytmu sortowania przez wybieranie.
Pogrubienie w kolumnie „Karty” oznacza elementy uporządkowane.
Numer | Karty | Najmniejsza karta | Operacja |
|---|---|---|---|
1 | A W 10 D K | 10 | zamiana A z 10 |
2 | 10 W A D K | W | brak zamiany, W jest na właściwym miejscu |
3 | 10 W A D K | D | zamiana A z D |
4 | 10 W D A K | K | zamiana A z K |
- | 10 W D K A | - | karty zostały uporządkowane |
Liczba elementów do uporządkowania: 5 Liczba powtórzeń: 4 | |||
Podczas sortowania z wykorzystaniem algorytmu przez wybieranie porządkowane dane dzielą się na dwie części: uporządkowaną i nieuporządkowaną. Wyszukiwanie najmniejszego albo największego (zależnie od przyjętych założeń) elementu odbywa się zawsze w części nieuporządkowanej, a znaleziony element dołączany jest do części uporządkowanej. Kiedy w części nieuporządkowanej pozostaje jeden element, algorytm kończy działanie.
Algorytm porządkowania metodą przez wybieranie
Napiszemy program, który uporządkuje w sposób niemalejący wyniki konkursu. Wykorzystamy algorytm porządkowania metodą przez wybieranie.
Dane wejściowe:
n– liczba naturalna, liczba elementów listywyniki– lista zawierająca nieuporządkowane liczby naturalne z przedziału <1; 50>.
Wynik:
wyniki– lista zawierająca uporządkowane niemalejąco liczby naturalne
Zmienne pomocnicze:
i,j,k– liczby naturalne, indeksy porównywanych elementów listy
Zapiszemy algorytm w postaci listy kroków.
Wczytaj wartość zmiennej
n.Do listy
wynikiwczytajnwyników.Do zmiennej
iprzypisz0.Dopóki
ijest mniejsze odn - 1, wykonuj:4.1. Do zmiennej
kprzypisz wartość zmienneji.4.2. Do zmiennej
jprzypiszi + 1.4.3. Dopóki
jjest mniejsze odn, wykonuj:4.3.1. Jeżeli liczba
wyniki[j]jest mniejsza od liczbywyniki[k], do zmiennejkprzypisz wartość zmiennejj.4.3.2. Zwiększ wartość zmiennej
jo 1.4.4. Zamień ze sobą wartości
wyniki[i]iwyniki[k].4.5. Zwiększ
io 1.Wypisz wartość zmiennej
wyniki.
W kroku 1 i 2 przygotowujemy dane wejściowe.
Właściwy algorytm porządkowania wymaga dwóch pętli.
Pętla zewnętrzna
W kroku 4 konstruujemy pętlę zewnętrzną, która wykonuje się n - 1 razy, ponieważ, jak wynika z podanych przykładów, tyle trzeba wykonać operacji wyszukiwania elementu najmniejszego (albo największego). W omawianej pętli korzystamy ze zmiennej iteracyjnejzmiennej iteracyjnej i, która przyjmuje wartości od 0 do n - 1.
Wyszukiwanie elementu najmniejszego
Wyszukiwanie najmniejszego elementu rozpoczynamy od zainicjowania jego indeksu, czyli zmiennej pomocniczejzmiennej pomocniczej k. Na początku każdego powtórzenia przypisujemy do niego i, tzn. indeks pierwszego nieuporządkowanego elementu listy.
W pętli wewnętrznejpętli wewnętrznej zapisanej w krokach 4.2 i 4.3, odczytujemy kolejne nieuporządkowane elementy wskazywane za pomocą indeksu j, który przyjmuje wartości od i + 1 do n - 1. Jeżeli dla któregoś z elementów warunek wyniki[j] < wyniki[k] będzie prawdziwy, aktualizujemy indeks najmniejszego elementu: k = j.
Zamiana elementów
Po zakończeniu pętli wewnętrznej indeks najmniejszego elementu zapisany jest w zmiennej k. Są dwie możliwości:
wśród nieuporządkowanych elementów nie ma mniejszego i wartość
kpozostaje równai, co oznacza, że kolejny element jest już na właściwym miejscu,znaleźliśmy mniejszy element wśród nieuporządkowanych elementów i wartość zmiennej
kuległa zmianie.
By uprościć budowę algorytmu, wykonujemy zamianę elementów o indeksach i oraz k, nawet jeżeli są równe. Operację tę wykonujemy w kroku 4.4.
Zapoznajmy się z przykładem, który pozwoli lepiej zrozumieć działania wykonywane w pętlach.
Przeanalizujmy, w jaki sposób działa porządkowanie liczb w sposób niemalejący za pomocą algorytmu wykorzystującego wybieranie.
Pogrubienie w kolumnie Sortowane liczby oznacza elementy uporządkowane.
Powtórzenie | Sortowane liczby | Najmniejsza liczba | Zmienne i operacja |
|---|---|---|---|
1 | 1 4 9 7 2 1 | 1 |
|
2 | 1 4 9 7 2 1 | 1 |
|
3 | 1 1 9 7 2 4 | 2 |
|
4 | 1 1 2 7 9 4 | 4 |
|
5 | 1 1 2 4 9 7 | 7 |
|
- | 1 1 2 4 7 9 | - | liczby zostały uporządkowane |
Liczba elementów do uporządkowania: 6 Liczba powtórzeń: 5 | |||
Po zakończeniu pętli wewnętrznej indeks najmniejszego elementu jest przechowywany w zmiennej k (k = 5).
Zapis algorytmu za pomocą języka Python
Do pisania programu użyj dostępnego w swoim środowisku edytora, np. IDLE dołączonego do standardowej instalacji języka Python.
Skopiuj kod, wklej go do pustego pliku i zapisz pod nazwą sort_wybieranie.py.
W instrukcji print() używamy symbolu * (gwiazdka), aby w terminalu wypisane zostały wartości z listy, tzn. oddzielone spacjami, bez dodatkowych znaków (nawiasów kwadratowych oraz przecinków) służących do zapisu listy.
Pętle
Zacznijmy od zapisania pętli zewnętrznej i zainicjowania indeksu najmniejszego elementu.
W pliku sort_wybieranie.py wstaw kod pętli zewnętrznej (krok 3 i 4), która korzysta ze zmiennej iteracyjnej i oraz wykonuje się n - 1 razy. Użyj instrukcji for i in range().
W ciele pętli zainicjuj zmienną k wartością i.
Zapiszmy pętlę wewnętrzną.
W pliku sort_wybieranie.py w pętli zewnętrznej po instrukcji inicjującej zmienną k dodaj pętlę (kroki 4.2, 4.3), która wykorzystuje zmienną j przyjmującą wartości z zakresu <i + 1, n - 1>. Użyj instrukcji for i in range().
Wewnątrz pętli umieść instrukcję warunkową wyniki[j] < wyniki[k].
Jeśli warunek jest prawdziwy, powinna zostać wykonana operacja przypisania k = j. Użyj instrukcji if.
Pozostaje zapisanie operacji zamiany wartości elementów o indeksach k oraz i, a następnie wypisanie wyniku.
W pliku sort_wybieranie.py wstaw podane instrukcje:
Użyty sposób zamiany wartości jest przykładem możliwego w języku Python przypisania wielokrotnego. W przypadku tej konstrukcji do zmiennych z lewej strony przypisywane są wartości kolejnych zmiennych z prawej strony. Są to początkowe wartości tych zmiennych. Dzięki temu możemy zamienić wartości dwóch elementów.
Innym sposobem zamiany wartości, który można stosować we wszystkich językach programowania, jest użycie zmiennej pomocniczej, w której zapamiętujemy jedną z zamienianych wartości:
Żeby zrozumieć konieczność użycia zmiennej pomocniczej, weźmy dla przykładu listę z dwoma wartościami: liczby = [4, 7]. Pierwsza wartość ma indeks 0, druga 1. Prześledźmy co się stanie, kiedy nie użyjemy zmiennej pomocniczej:
Po wykonaniu tej operacji lista ma postać: [7, 7]. Na pozycji 0 znalazła się wartość 7 spod indeksu 1. Wartość 4 została nadpisana.
Wykonajmy kolejną operację:
Zawartość listy się nie zmienia, ponieważ na obu pozycjach jest ta sama wartość, czyli 7.
Przetestujmy działanie programu.
Uruchom program sort_wybieranie.py.
Notatnik
Animacja (samouczek)
Film przedstawia program wykorzystujący algorytm porządkowania przez wybieranie. Wypisuje znaki z pobranego napisu w porządku alfabetycznym (leksykograficznym), np. dla słowa czara powinniśmy otrzymać ciąg znaków a a c r z.

Film dostępny pod adresem /preview/resource/RRs30Jc8FiQa5
Film przedstawia algorytm sortowania metodą porządkowania
Pełny kod programu:
napis = list(napis) zamienia ciąg znaków na listę, aby można było...Uruchom program sortuj_napis.py, podając napis: 675431. Ile niepotrzebnych zamian znaków wykona algorytm? Przez niepotrzebną zamianę rozumiemy przypadek, kiedy znak jest już na swoim miejscu.
Wskazówka: Zwróć uwagę na wypisane komunikaty. Ile razy zmienne i oraz k są sobie równe?
Zmień program sortuj_napis.py w taki sposób, żeby porządkował podane znaki w sposób nierosnący. Przetestuj działanie programu dla napisów: test i testy. Ile było niepotrzebnych zamian znaków?
Wskazówka: Aby zmienić porządek sortowania, należy wprowadzić zmianę w kodzie instrukcji warunkowej.
Zestaw ćwiczeń interaktywnych
Jeżeli mamy
n elementów do posortowania metodą przez wybieranie, to liczba powtórzeń operacji wybierania najmniejszego/największego elementu wyniesie: Możliwe odpowiedzi: 1. n - 1, 2. n, 3. n + 1Zapoznaj się z fragmentem kodu i wykonaj ćwiczenie.
Do zakodowania algorytmu porządkowania metodą przez wybieranie użyjesz: Możliwe odpowiedzi: 1. instrukcji pobierania, 2. pętli
while, 3. pętli for, 4. instrukcji warunkowej, 5. operacji zamiany wartościfor j in range(i+1, n):, 2. for i in range(n-1), 3. wyniki[i], wyniki[k] = wyniki[k], wyniki[i], 4. k = j, 5. if wyniki[j] < wyniki[k]:, 6. k = iZadaniem pętli wewnętrznej w algorytmie porządkowania metodą przez wybieranie jest: Możliwe odpowiedzi: 1. wyszukiwanie najmniejszego / największego elementu wśród elementów nieuporządkowanych, 2. zamiana wartości elementów, 3. wyszukiwanie najmniejszego / największego elementu wśród wszystkich elementów, 4. pobieranie elementów
W wyniku wykonania instrukcji
a, b = b, a: Możliwe odpowiedzi: 1. wartości zmiennych a i b zostaną zamienione, 2. wartości zmiennych a i b zostaną podwojone, 3. otrzymamy wartość True lub False, 4. zostanie wyświetlony błąd składniĆwiczenie wykonaj, korzystając z testerki.
Ćwiczenie wykonaj, korzystając z testerki.
Słownik
pętle, które zostały zamieszczone wewnątrz innych pętli; dla każdego powtórzenia pętli zewnętrznej wykonywane są wszystkie powtórzenia pętli wewnętrznej
zmienna kontrolująca działanie pętli; w języku Python w każdym powtórzeniu przyjmuje kolejne wartości ze zdefiniowanego zakresu
zmienna tymczasowo przechowująca pośredni wynik obliczeń lub daną wartość