Implementacja algorytmu sortowania pozycyjnego słów w języku Python

Algorytm pomocniczy – sortowanie przez zliczanie

Sortowanie pozycyjne służy do sortowania zbiorów danych według porządku leksykograficznegoporządek leksykograficznyporządku leksykograficznego.  Algorytm ten wewnętrznie używa pomocniczego – innego niż sortowanie pozycyjne – algorytmu sortowania, który jest odpowiedzialny za sortowanie według poszczególnych elementów w ciągach.

Pamiętajmy, że zastosowany algorytm musi być stabilnystabilny algorytm sortowaniastabilny – możemy użyć dowolnego algorytmu, jeśli tylko spełnia on ten warunek. Sortowanie pozycyjne jest często łączone np. z sortowaniem przez zliczaniePNx8quWZlsortowaniem przez zliczanie, ponieważ oba algorytmy są relatywnie szybkie dla rozważanego typu danych (ciągów znaków).

Algorytm sortowania przez zliczanie został wykorzystany jako algorytm pomocniczy w sekcji „Film samouczek”. Przypomnijmy jego implementację.

Specyfikacja problemu:

Dane:

  • dane – jednowymiarowa lista przechowująca łańcuchy znaków, która zawiera imiona do posortowania

Wynik:

  • program wypisuje posortowane w kolejności niemalejącej imiona z listy dane, wykorzystując sortowanie pozycyjne słów; kolejne elementy powinny być oddzielone pojedynczym znakiem spacji

Przetestujemy działanie programu dla następującej listy dane = [ "igor", "ala", "adam" ].

Kod zawiera trzy funkcje realizujące algorytm.

Zadaniem funkcji przygotuj_napisy() jest przygotowanie ciągów w liście dane tak, aby wszystkie miały taką samą długość równą wartości zmiennej dlugosc_najdluzszego_slowa. Jeżeli któryś z ciągów jest krótszy, zostaje na końcu (po ostatnim znaku) uzupełniony znakami grawisu – ` (jest to ostatni – przed małymi literami – znak w tablicy ASCII).

Funkcja wyczysc_napisy() ma zadanie odwrotne – po wykonaniu sortowania musi usunąć nadmiarowe znaki grawisów, zastępując je spacjami.

Funkcja sortowanie_przez_zliczanie() realizuje algorytm sortowania przez zliczanie.

Linia 1. def przygotuj podkreślnik napisy otwórz nawias okrągły dane przecinek dlugosc podkreślnik najdluzszego podkreślnik slowa zamknij nawias okrągły dwukropek. Linia 2. for indeks przecinek slowo in enumerate otwórz nawias okrągły dane zamknij nawias okrągły dwukropek. Linia 3. while len otwórz nawias okrągły slowo zamknij nawias okrągły otwórz nawias ostrokątny dlugosc podkreślnik najdluzszego podkreślnik slowa dwukropek. Linia 4. slowo plus znak równości cudzysłów ` cudzysłów. Linia 5. dane otwórz nawias kwadratowy indeks zamknij nawias kwadratowy znak równości slowo. Linia 7. def wyczysc podkreślnik napisy otwórz nawias okrągły dane zamknij nawias okrągły dwukropek. Linia 8. for indeks przecinek slowo in enumerate otwórz nawias okrągły dane zamknij nawias okrągły dwukropek. Linia 9. dane otwórz nawias kwadratowy indeks zamknij nawias kwadratowy znak równości slowo kropka replace otwórz nawias okrągły cudzysłów ` cudzysłów przecinek cudzysłów cudzysłów zamknij nawias okrągły. Linia 11. def sortowanie podkreślnik pozycyjne podkreślnik slow otwórz nawias okrągły dane zamknij nawias okrągły dwukropek. Linia 12. dlugosc podkreślnik najdluzszego podkreślnik slowa znak równości max otwórz nawias okrągły otwórz nawias kwadratowy len otwórz nawias okrągły slowo zamknij nawias okrągły for slowo in dane zamknij nawias kwadratowy zamknij nawias okrągły. Linia 14. przygotuj podkreślnik napisy otwórz nawias okrągły dane przecinek dlugosc podkreślnik najdluzszego podkreślnik slowa zamknij nawias okrągły. Linia 16. for i in range otwórz nawias okrągły dlugosc podkreślnik najdluzszego podkreślnik slowa minus 1 przecinek minus 1 przecinek minus 1 zamknij nawias okrągły dwukropek. Linia 17. sortowanie podkreślnik przez podkreślnik zliczanie otwórz nawias okrągły dane przecinek i zamknij nawias okrągły. Linia 19. wyczysc podkreślnik napisy otwórz nawias okrągły dane zamknij nawias okrągły. Linia 21. return dane. Linia 24. def sortowanie podkreślnik przez podkreślnik zliczanie otwórz nawias okrągły dane przecinek indeks podkreślnik znaku zamknij nawias okrągły dwukropek. Linia 25. lista podkreślnik zliczen podkreślnik liczb znak równości otwórz nawias kwadratowy 0 for x in range otwórz nawias okrągły 27 zamknij nawias okrągły zamknij nawias kwadratowy. Linia 26. for slowo in dane dwukropek. Linia 27. odczytany podkreślnik kod podkreślnik znaku znak równości ord otwórz nawias okrągły slowo otwórz nawias kwadratowy indeks podkreślnik znaku zamknij nawias kwadratowy zamknij nawias okrągły minus ord otwórz nawias okrągły cudzysłów ` cudzysłów zamknij nawias okrągły. Linia 28. lista podkreślnik zliczen podkreślnik liczb otwórz nawias kwadratowy odczytany podkreślnik kod podkreślnik znaku zamknij nawias kwadratowy plus znak równości 1. Linia 30. for i in range otwórz nawias okrągły 1 przecinek len otwórz nawias okrągły lista podkreślnik zliczen podkreślnik liczb zamknij nawias okrągły zamknij nawias okrągły dwukropek. Linia 31. lista podkreślnik zliczen podkreślnik liczb otwórz nawias kwadratowy i zamknij nawias kwadratowy plus znak równości lista podkreślnik zliczen podkreślnik liczb otwórz nawias kwadratowy i minus 1 zamknij nawias kwadratowy. Linia 33. temp znak równości otwórz nawias kwadratowy cudzysłów cudzysłów for slowo in dane zamknij nawias kwadratowy. Linia 35. for i in range otwórz nawias okrągły len otwórz nawias okrągły dane zamknij nawias okrągły minus 1 przecinek minus 1 przecinek minus 1 zamknij nawias okrągły dwukropek. Linia 36. odczytany podkreślnik kod podkreślnik znaku znak równości ord otwórz nawias okrągły dane otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy indeks podkreślnik znaku zamknij nawias kwadratowy zamknij nawias okrągły minus ord otwórz nawias okrągły cudzysłów ` cudzysłów zamknij nawias okrągły. Linia 37. indeks podkreślnik w podkreślnik liscie podkreślnik wynikowej znak równości lista podkreślnik zliczen podkreślnik liczb otwórz nawias kwadratowy odczytany podkreślnik kod podkreślnik znaku zamknij nawias kwadratowy minus 1. Linia 38. temp otwórz nawias kwadratowy indeks podkreślnik w podkreślnik liscie podkreślnik wynikowej zamknij nawias kwadratowy znak równości dane otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 39. lista podkreślnik zliczen podkreślnik liczb otwórz nawias kwadratowy odczytany podkreślnik kod podkreślnik znaku zamknij nawias kwadratowy minus znak równości 1. Linia 41. for i in range otwórz nawias okrągły len otwórz nawias okrągły temp zamknij nawias okrągły zamknij nawias okrągły dwukropek. Linia 42. dane otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości temp otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 44. dane znak równości otwórz nawias kwadratowy cudzysłów igor cudzysłów przecinek cudzysłów ala cudzysłów przecinek cudzysłów adam cudzysłów zamknij nawias kwadratowy. Linia 45. dane znak równości sortowanie podkreślnik pozycyjne podkreślnik slow otwórz nawias okrągły dane zamknij nawias okrągły. Linia 47. for i in range otwórz nawias okrągły 0 przecinek len otwórz nawias okrągły dane zamknij nawias okrągły zamknij nawias okrągły dwukropek. Linia 48. print otwórz nawias okrągły dane otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły.

Efektem działania programu jest wyświetlenie danych ciągów znaków już po posortowaniu. Ciągi wyświetlane są w kolejnych wierszach:

Linia 1. adam. Linia 2. ala. Linia 3. igor.

Algorytm pomocniczy – sortowanie bąbelkowe

Zapoznajmy się z implementacją wykorzystującą inny algorytm pomocniczy – algorytm sortowania bąbelkowegoPCfvfjgLkalgorytm sortowania bąbelkowego.

Przykład 1

Uporządkujmy listę imion w kolejności alfabetycznej. Wszystkie te imiona składają się z czterech liter, dlatego wykonamy cztery iteracje – w każdej będziemy porządkować odpowiednie pozycje słów. W każdej z iteracji część kubełków pozostaje pusta. Liczba kubełków jest zdeterminowana liczbą różnych liter występujących w imionach.

Linia 1. kratka wejściowa lista imion. Linia 2. cudzysłów KUBA cudzysłów przecinek. Linia 3. cudzysłów EMIL cudzysłów przecinek. Linia 4. cudzysłów ADAM cudzysłów przecinek. Linia 5. cudzysłów IGOR cudzysłów przecinek. Linia 6. cudzysłów ALEK cudzysłów przecinek. Linia 7. cudzysłów HUGO cudzysłów przecinek. Linia 8. cudzysłów ERYK cudzysłów przecinek. Linia 10. kratka lista kubełków. Linia 11. apostrof K apostrof przecinek apostrof U apostrof przecinek apostrof B apostrof przecinek apostrof A apostrof przecinek apostrof E apostrof przecinek apostrof M apostrof przecinek apostrof I apostrof przecinek apostrof L apostrof przecinek apostrof D apostrof przecinek apostrof G apostrof przecinek apostrof O apostrof przecinek apostrof R apostrof przecinek apostrof H apostrof przecinek apostrof Y apostrof.

W pierwszej iteracji sprawdzamy ostatnią literę:

Linia 1. kratka wypisane będą tylko kubełki cudzysłów zapełnione cudzysłów. Linia 2. apostrof A apostrof minus cudzysłów KUBA cudzysłów. Linia 3. apostrof K apostrof minus cudzysłów ALEK cudzysłów przecinek cudzysłów ERYK cudzysłów. Linia 4. apostrof L apostrof minus cudzysłów EMIL cudzysłów. Linia 5. apostrof M apostrof minus cudzysłów ADAM cudzysłów. Linia 6. apostrof O apostrof minus cudzysłów HUGO cudzysłów. Linia 7. apostrof R apostrof minus cudzysłów IGOR cudzysłów.

W drugiej iteracji sprawdzamy przedostatnią literę:

Linia 1. kratka wypisane będą tylko kubełki cudzysłów zapełnione cudzysłów. Linia 2. apostrof A apostrof minus cudzysłów ADAM cudzysłów. Linia 3. apostrof B apostrof minus cudzysłów KUBA cudzysłów. Linia 4. apostrof E apostrof minus cudzysłów ALEK cudzysłów. Linia 5. apostrof G apostrof minus cudzysłów HUGO cudzysłów. Linia 6. apostrof I apostrof minus cudzysłów EMIL cudzysłów. Linia 7. apostrof O apostrof minus cudzysłów IGOR cudzysłów. Linia 8. apostrof Y apostrof minus cudzysłów ERYK cudzysłów.

W trzeciej iteracji sprawdzamy literę trzecią od końca:

Linia 1. kratka wypisane będą tylko kubełki cudzysłów zapełnione cudzysłów. Linia 2. apostrof D apostrof minus cudzysłów ADAM dwukropek cudzysłów. Linia 3. apostrof G apostrof minus cudzysłów IGOR cudzysłów. Linia 4. apostrof L apostrof minus cudzysłów ALEK cudzysłów. Linia 5. apostrof M apostrof minus cudzysłów EMIL cudzysłów. Linia 6. apostrof R apostrof minus cudzysłów ERYK cudzysłów. Linia 7. apostrof U apostrof minus cudzysłów KUBA cudzysłów przecinek cudzysłów HUGO cudzysłów.

W czwartej iteracji sprawdzamy literę czwartą od końca (czyli w tym przypadku pierwszą):

Linia 1. kratka wypisane będą tylko kubełki cudzysłów zapełnione cudzysłów. Linia 2. apostrof A apostrof minus cudzysłów ADAM cudzysłów przecinek cudzysłów ALEK cudzysłów przecinek. Linia 3. apostrof E apostrof minus cudzysłów EMIL cudzysłów przecinek cudzysłów ERYK cudzysłów. Linia 4. apostrof H apostrof minus cudzysłów HUGO cudzysłów. Linia 5. apostrof I apostrof minus cudzysłów IGOR cudzysłów. Linia 6. apostrof K apostrof minus cudzysłów KUBA cudzysłów.

W efekcie uzyskujemy imiona posortowane alfabetycznie:

Linia 1. cudzysłów ADAM cudzysłów przecinek cudzysłów ALEK cudzysłów przecinek cudzysłów EMIL cudzysłów przecinek cudzysłów ERYK cudzysłów przecinek cudzysłów HUGO cudzysłów przecinek cudzysłów IGOR cudzysłów przecinek cudzysłów KUBA cudzysłów.
Ważne!

Możemy z łatwością zauważyć, jak w kolejnych kubełkach pojawiają się słowa. Problem pojawia się w przypadku słów o różnej długości – wówczas musimy zadecydować, gdzie umieścić słowa krótsze. Kiedy wykraczamy poza ostatnią literę takiego słowa, dopisujemy słowo do tworzonego w danej iteracji ciągu wszystkich słów, do którego po zakończeniu wypełniania kubełków będziemy dopisywać słowa z opróżnianych kubełków.

Przykład 2

Przygotujmy program, który zrealizuje sortowanie pozycyjne słów.

Specyfikacja problemu

Dane:

  • dane – lista ciągów znaków zawierająca teksty do posortowania

Wynik:

  • lista_posortowana – posortowana lista ciągów znaków

Działanie programu przetestujemy dla następującej listy:

dane = [ "igor", "ala", "adam" ]

Widzimy, że liczba znaków w danych wejściowych może być różna, więc musimy napisać funkcję pomocniczą, która sprawdzi, ile liter ma najdłuższe słowo. Następnie funkcja zwróci liczbę iteracji oraz stworzy listę unikatowych liter występujących w słowach. Celem jest przygotowanie słownika, który będziemy wykorzystywać w procesie sortowania bąbelkowego.

Implementację algorytmu sortowania bąbelkowego znajdziesz w e‑materiale mu poświęconym Sortowanie bąbelkowe w języku PythonPoYAEP8llSortowanie bąbelkowe w języku Python.

Linia 1. def przygotuj podkreślnik napisy otwórz nawias okrągły dane przecinek dlugosc podkreślnik najdluzszego podkreślnik slowa zamknij nawias okrągły dwukropek. Linia 2. for indeks przecinek slowo in enumerate otwórz nawias okrągły dane zamknij nawias okrągły dwukropek. Linia 3. while len otwórz nawias okrągły slowo zamknij nawias okrągły otwórz nawias ostrokątny dlugosc podkreślnik najdluzszego podkreślnik slowa dwukropek. Linia 4. slowo plus znak równości cudzysłów ` cudzysłów. Linia 5. dane otwórz nawias kwadratowy indeks zamknij nawias kwadratowy znak równości slowo. Linia 7. def wyczysc podkreślnik napisy otwórz nawias okrągły dane zamknij nawias okrągły dwukropek. Linia 8. for indeks przecinek slowo in enumerate otwórz nawias okrągły dane zamknij nawias okrągły dwukropek. Linia 9. dane otwórz nawias kwadratowy indeks zamknij nawias kwadratowy znak równości slowo kropka replace otwórz nawias okrągły cudzysłów ` cudzysłów przecinek cudzysłów cudzysłów zamknij nawias okrągły. Linia 11. def sortowanie podkreślnik pozycyjne podkreślnik slow otwórz nawias okrągły dane zamknij nawias okrągły dwukropek. Linia 12. dlugosc podkreślnik najdluzszego podkreślnik slowa znak równości max otwórz nawias okrągły otwórz nawias kwadratowy len otwórz nawias okrągły slowo zamknij nawias okrągły for slowo in dane zamknij nawias kwadratowy zamknij nawias okrągły. Linia 14. przygotuj podkreślnik napisy otwórz nawias okrągły dane przecinek dlugosc podkreślnik najdluzszego podkreślnik slowa zamknij nawias okrągły. Linia 16. for i in range otwórz nawias okrągły dlugosc podkreślnik najdluzszego podkreślnik slowa minus 1 przecinek minus 1 przecinek minus 1 zamknij nawias okrągły dwukropek. Linia 17. sortowanie podkreślnik babelkowe otwórz nawias okrągły dane zamknij nawias okrągły. Linia 19. wyczysc podkreślnik napisy otwórz nawias okrągły dane zamknij nawias okrągły. Linia 21. return dane. Linia 24. def sortowanie podkreślnik babelkowe otwórz nawias okrągły dane zamknij nawias okrągły dwukropek. Linia 25. for i in range otwórz nawias okrągły 0 przecinek n minus 1 zamknij nawias okrągły dwukropek. Linia 26. wykonanie znak równości False. Linia 27. for j in range otwórz nawias okrągły 0 przecinek n minus i minus 1 zamknij nawias okrągły dwukropek. Linia 28. if dane otwórz nawias kwadratowy j zamknij nawias kwadratowy zamknij nawias ostrokątny dane otwórz nawias kwadratowy j plus 1 zamknij nawias kwadratowy dwukropek. Linia 29. wykonanie znak równości True. Linia 30. pomoc znak równości dane otwórz nawias kwadratowy j plus 1 zamknij nawias kwadratowy. Linia 31. dane otwórz nawias kwadratowy j plus 1 zamknij nawias kwadratowy znak równości dane otwórz nawias kwadratowy j zamknij nawias kwadratowy. Linia 32. dane otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości pomoc. Linia 33. if not wykonanie dwukropek. Linia 34. break. Linia 36. dane znak równości otwórz nawias kwadratowy cudzysłów igor cudzysłów przecinek cudzysłów ala cudzysłów przecinek cudzysłów adam cudzysłów zamknij nawias kwadratowy. Linia 37. n znak równości len otwórz nawias okrągły dane zamknij nawias okrągły. Linia 38. dane znak równości sortowanie podkreślnik pozycyjne podkreślnik slow otwórz nawias okrągły dane zamknij nawias okrągły. Linia 40. for i in range otwórz nawias okrągły 0 przecinek len otwórz nawias okrągły dane zamknij nawias okrągły zamknij nawias okrągły dwukropek. Linia 41. print otwórz nawias okrągły dane otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły.

Wynikiem działania jest posortowana lista: ["adam","ala","igor"]

Ciekawostka

Korzystając z tej funkcji, stworzymy program wizualizujący – za pomocą modułu matplotlibmatplotlibmatplotlib – zależność operacji sortowania losowej listy słów od liczby elementów wejściowej listy danych oraz od długości największego elementu listy. Aby wygenerować różne słowa, użyjemy losowych liter alfabetu łacińskiego. Operacjami dominującymi w tym algorytmie są operacje umieszczania elementów w kubełku.

Linia 1. from random import randint przecinek choice. Linia 2. import matplotlib kropka pyplot as plt. Linia 4. def sortowanie podkreślnik poz podkreślnik slow podkreślnik wizualizacja otwórz nawias okrągły lista podkreślnik slow zamknij nawias okrągły dwukropek. Linia 6. def kubelki podkreślnik iteracje otwórz nawias okrągły lista zamknij nawias okrągły dwukropek. Linia 7. kub znak równości otwórz nawias kwadratowy zamknij nawias kwadratowy. Linia 8. dl znak równości 0. Linia 9. for w in lista dwukropek. Linia 10. if len otwórz nawias okrągły w zamknij nawias okrągły zamknij nawias ostrokątny dl dwukropek. Linia 11. dl znak równości len otwórz nawias okrągły w zamknij nawias okrągły. Linia 12. for l in w dwukropek. Linia 13. if not l kropka upper otwórz nawias okrągły zamknij nawias okrągły in kub dwukropek. Linia 14. kub kropka append otwórz nawias okrągły l kropka upper otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły. Linia 15. return otwórz nawias okrągły sorted otwórz nawias okrągły kub zamknij nawias okrągły przecinek dl zamknij nawias okrągły. Linia 17. def sortuj otwórz nawias okrągły lista przecinek pozycja przecinek kb zamknij nawias okrągły dwukropek. Linia 18. oper znak równości 0. Linia 19. l znak równości otwórz nawias kwadratowy zamknij nawias kwadratowy. Linia 20. kubelki znak równości otwórz nawias klamrowy p dwukropek otwórz nawias kwadratowy zamknij nawias kwadratowy for p in kb zamknij nawias klamrowy. Linia 21. for w in lista dwukropek. Linia 22. oper plus znak równości 1. Linia 23. if len otwórz nawias okrągły w zamknij nawias okrągły otwórz nawias ostrokątny pozycja dwukropek. Linia 24. l kropka insert otwórz nawias okrągły 0 przecinek w zamknij nawias okrągły. Linia 25. else dwukropek. Linia 26. kubelki otwórz nawias kwadratowy w otwórz nawias kwadratowy pozycja minus 1 zamknij nawias kwadratowy kropka upper otwórz nawias okrągły zamknij nawias okrągły zamknij nawias kwadratowy kropka append otwórz nawias okrągły w zamknij nawias okrągły. Linia 27. kratka przepisanie z kubełków do listy. Linia 28. for i in kubelki dwukropek. Linia 29. if len otwórz nawias okrągły kubelki otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły zamknij nawias ostrokątny 0 dwukropek. Linia 30. l plus znak równości kubelki otwórz nawias kwadratowy i zamknij nawias kwadratowy. Linia 31. oper plus znak równości 1. Linia 32. kratka zwracamy posortowane wg określonej pozycji. Linia 33. return l otwórz nawias kwadratowy dwukropek zamknij nawias kwadratowy przecinek oper. Linia 36. kb przecinek il znak równości kubelki podkreślnik iteracje otwórz nawias okrągły lista podkreślnik slow zamknij nawias okrągły. Linia 37. operacje znak równości 0. Linia 39. for i in range otwórz nawias okrągły il przecinek 0 przecinek minus 1 zamknij nawias okrągły dwukropek. Linia 40. lista podkreślnik slow przecinek op znak równości sortuj otwórz nawias okrągły lista podkreślnik slow przecinek i przecinek kb zamknij nawias okrągły. Linia 41. operacje plus znak równości op. Linia 43. return operacje. Linia 46. litery znak równości cudzysłów ABCDEFGHIJKLMNOPQRSTUVWXYZ cudzysłów. Linia 47. lista podkreślnik wejsciowa znak równości otwórz nawias kwadratowy zamknij nawias kwadratowy. Linia 48. X0 znak równości otwórz nawias kwadratowy zamknij nawias kwadratowy. Linia 49. Y0 znak równości otwórz nawias kwadratowy zamknij nawias kwadratowy. Linia 51. for i in range otwórz nawias okrągły 10 przecinek 1001 przecinek 100 zamknij nawias okrągły dwukropek. Linia 52. lista znak równości otwórz nawias kwadratowy zamknij nawias kwadratowy. Linia 53. max podkreślnik dl znak równości 0. Linia 54. for j in range otwórz nawias okrągły i zamknij nawias okrągły dwukropek. Linia 55. slowo znak równości apostrof apostrof kropka join otwórz nawias okrągły choice otwórz nawias okrągły litery zamknij nawias okrągły for podkreślnik in range otwórz nawias okrągły randint otwórz nawias okrągły 4 przecinek 40 zamknij nawias okrągły zamknij nawias okrągły zamknij nawias okrągły. Linia 56. lista kropka append otwórz nawias okrągły slowo zamknij nawias okrągły. Linia 57. if len otwórz nawias okrągły slowo zamknij nawias okrągły zamknij nawias ostrokątny max podkreślnik dl dwukropek. Linia 58. max podkreślnik dl znak równości len otwórz nawias okrągły slowo zamknij nawias okrągły. Linia 59. lista podkreślnik wejsciowa kropka append otwórz nawias okrągły lista zamknij nawias okrągły. Linia 60. X0 kropka append otwórz nawias okrągły len otwórz nawias okrągły lista zamknij nawias okrągły zamknij nawias okrągły. Linia 64. for lista podkreślnik test in lista podkreślnik wejsciowa dwukropek. Linia 65. ile podkreślnik operacji znak równości sortowanie podkreślnik poz podkreślnik slow podkreślnik wizualizacja otwórz nawias okrągły lista podkreślnik test zamknij nawias okrągły. Linia 66. Y0 kropka append otwórz nawias okrągły ile podkreślnik operacji zamknij nawias okrągły. Linia 68. plt kropka plot otwórz nawias okrągły X0 przecinek Y0 przecinek label znak równości cudzysłów Liczba operacji sortowania cudzysłów zamknij nawias okrągły. Linia 69. plt kropka xlabel otwórz nawias okrągły cudzysłów Liczba słów do sortowania cudzysłów zamknij nawias okrągły. Linia 70. plt kropka ylabel otwórz nawias okrągły cudzysłów Liczba przeprowadzonych operacji cudzysłów zamknij nawias okrągły. Linia 71. plt kropka legend otwórz nawias okrągły zamknij nawias okrągły. Linia 72. plt kropka grid otwórz nawias okrągły True zamknij nawias okrągły. Linia 73. plt kropka show otwórz nawias okrągły zamknij nawias okrągły.

Wynikiem działania programu jest następujący wykres:

RmrlOV44huRbH
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.
Ważne!

Złożoność czasowa tego algorytmu jest liniowa i wynosi O(d(n + k)), gdzie k to liczba różnych liter, a d to maksymalna długość słowa. Podstawową operacją jest tu przenoszenie elementu do kubełka lub na początek ciągu.

Już wiesz

Podsumujmy najważniejsze elementy omówione w tym e‑materiale.

  • Sortowanie pozycyjne jest odpowiednie do porządkowania elementów (obiektów, wielkości), w których można wyróżnić pozycje.

  • Złożoność czasowa to O(d(n + k)).

  • Sortowanie pozycyjne wymaga zastosowania dodatkowej listy pomocniczej służącej do sprawdzenia, ile liter ma najdłuższe słowo.

  • Sortowanie pozycyjne słów wymaga zastosowania pomocniczego stabilnego algorytmu sortowania, np. bąbelkowego lub przez zliczanie.

Słownik

matplotlib
matplotlib

biblioteka służąca do przedstawienia obrazów złożonych z punktów o współrzędnych x oraz y (wykresów, histogramów, rozkładów itp.); moduł ten nie jest dostępny w standardowej instalacji języka Python - należy go zainstalować, korzystając z mechanizmu pip

porządek leksykograficzny
porządek leksykograficzny

sposób porządkowania elementów zbioru analogiczny do kolejności alfabetycznej

stabilny algorytm sortowania
stabilny algorytm sortowania

algorytm, który dla dwóch równych elementów w zbiorze danych wejściowych zachowuje ich kolejność przed i po sortowaniu