RKRNAOSZ4SAMD
Zdjęcie przedstawia owoce sezonowe w małych pojemnikach, porzeczki, jagody, borówki, maliny i poziomki.

PY_I_R_W13A_M04 Wbudowane funkcje sortowania

Źródło: Alex Block, domena publiczna.

Podczas omawiania funkcji sortowania dostępnych w poszczególnych językach programowania skupimy się na dostępnych w nich klasach i funkcjach wbudowanychfunkcja wbudowanafunkcjach wbudowanych, związanych z algorytmami sortowania.

Ważne!

W zależności od języka programowania funkcje sortujące wywoływane są poprzez podanie ich nazwy, np. sort() lub poprzez podanie klasy albo obiektu i nazwy, np. Arrays.sort() lub lista.sort(). W tym drugim przypadku należy posługiwać się terminem metoda, który oznacza składową funkcję klasy. W tym e‑materiale będziemy zachowywać to rozróżnienie.

Funkcje w języku Python

sorted()

Funkcja sorted() jest częścią biblioteki standardowej języka Python i wykorzystywana jest do porządkowania danych różnych typu. Mogą to być np. listy, krotki, ciągi znaków, słowniki czy zbiory.

Podczas sortowania funkcja korzysta z algorytmu timsorttimsorttimsort, nie modyfikuje sortowanych obiektów, ale zwraca nową posortowaną listę. Zastosowany algorytm gwarantuje stabilność sortowania.

Przykład 1

Oto przykład porządkowania listy liczb. Warto zwrócić uwagę, że w drugim wywołaniu funkcji używamy dodatkowego argumentu reverse.

Linia 1. lista znak równości otwórz nawias kwadratowy 3 kropka 14 przecinek minus 59 przecinek 32 przecinek 0 przecinek minus 500 przecinek 400 przecinek 1 zamknij nawias kwadratowy. Linia 3. print otwórz nawias okrągły sorted otwórz nawias okrągły lista zamknij nawias okrągły zamknij nawias okrągły. Linia 4. print otwórz nawias okrągły sorted otwórz nawias okrągły lista przecinek reverse znak równości True zamknij nawias okrągły zamknij nawias okrągły.

Wynik działania programu:

Linia 1. otwórz nawias kwadratowy minus 500 przecinek minus 59 przecinek 0 przecinek 1 przecinek 3 kropka 14 przecinek 32 przecinek 400 zamknij nawias kwadratowy. Linia 2. otwórz nawias kwadratowy 400 przecinek 32 przecinek 3 kropka 14 przecinek 1 przecinek 0 przecinek minus 59 przecinek minus 500 zamknij nawias kwadratowy.
Ćwiczenie 1
RJOGOAIFKq07K
Ćwiczenie 2

Dana jest lista liczb: lista = [5, 8, -3, 1, 10, 3.14, 18]. Podaj ciąg wywołań instrukcji sorted(), który po wykonaniu spowoduje wypisanie następujących komunikatów:

Linia 1. otwórz nawias kwadratowy minus 3 przecinek 1 przecinek 3 kropka 14 przecinek 5 przecinek 8 przecinek 10 przecinek 18 zamknij nawias kwadratowy. Linia 2. otwórz nawias kwadratowy 18 przecinek 10 przecinek 8 przecinek 5 przecinek 3 kropka 14 przecinek 1 przecinek minus 3 zamknij nawias kwadratowy. Linia 3. otwórz nawias kwadratowy minus 3 przecinek 1 przecinek 3 kropka 14 przecinek 5 przecinek 8 przecinek 10 przecinek 18 zamknij nawias kwadratowy.
R4alsIc7ohX80

Funkcja sorted() umożliwia określanie własnych kryteriów sortowania za pomocą opcjonalnego argumentu key. Zapoznajmy się z przykładami.

Ważne!

Jeżeli jako argument key, tj. klucz, podamy wartość None lub w ogóle go nie podamy, zastosowane zostanie sortowanie domyślne, tj. niemalejąco.

W poniższym przykładzie będzie to porządkowanie alfabetyczne słów według kodów znaków, dlatego wyrazy pisane wielkimi literami znajdą się na początku zwróconej listy.

Linia 1. print otwórz nawias okrągły sorted otwórz nawias okrągły cudzysłów Przykładowy tekst który chcemy uporządkować cudzysłów kropka split otwórz nawias okrągły zamknij nawias okrągły przecinek key znak równości None zamknij nawias okrągły zamknij nawias okrągły. Linia 2. print otwórz nawias okrągły sorted otwórz nawias okrągły cudzysłów Przykładowy tekst który chcemy uporządkować cudzysłów kropka split otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły zamknij nawias okrągły.

Wynik działania programu:

Linia 1. otwórz nawias kwadratowy apostrof Przykładowy apostrof przecinek apostrof chcemy apostrof przecinek apostrof który apostrof przecinek apostrof tekst apostrof przecinek apostrof uporządkować apostrof zamknij nawias kwadratowy. Linia 2. otwórz nawias kwadratowy apostrof Przykładowy apostrof przecinek apostrof chcemy apostrof przecinek apostrof który apostrof przecinek apostrof tekst apostrof przecinek apostrof uporządkować apostrof zamknij nawias kwadratowy.
Przykład 2

W poniższym kodzie jako argumentu key używamy funkcji anonimowejfunkcja anonimowafunkcji anonimowej wprowadzanej przez słowo kluczowe lambda. Funkcja wykonywana jest na każdym elemencie listy przekazywanym w argumencie element przed posortowaniem i zwraca klucz, tj.  wartość wykorzystywaną do sortowania.

W tym przypadku jest to wartość True, jeżeli element jest liczbą parzystą, czyli jest większy, lub False w przeciwnym przypadku, czyli gdy jest mniejszy. Dlatego w posortowanej liście liczby nieparzyste będą poprzedzały parzyste.

Linia 1. lista znak równości otwórz nawias kwadratowy 1 przecinek 2 przecinek 3 przecinek 4 przecinek 5 przecinek 6 przecinek 7 przecinek 8 przecinek 9 przecinek 10 zamknij nawias kwadratowy. Linia 3. print otwórz nawias okrągły sorted otwórz nawias okrągły lista przecinek key znak równości lambda element dwukropek element procent 2 znak równości znak równości 0 zamknij nawias okrągły zamknij nawias okrągły.

Wynik działania programu:

Linia 1. otwórz nawias kwadratowy 1 przecinek 3 przecinek 5 przecinek 7 przecinek 9 przecinek 2 przecinek 4 przecinek 6 przecinek 8 przecinek 10 zamknij nawias kwadratowy.
Przykład 3

Zapoznajmy się z przykładem programu, który porządkuje wyrazy zapisane w ciągu znaków niemalejąco pod względem ich długości.

Linia 1. print otwórz nawias okrągły sorted otwórz nawias okrągły cudzysłów Przykładowy tekst który chcemy uporządkować cudzysłów kropka split otwórz nawias okrągły zamknij nawias okrągły przecinek key znak równości len zamknij nawias okrągły zamknij nawias okrągły.

Wynik działania programu:

Linia 1. otwórz nawias kwadratowy apostrof tekst apostrof przecinek apostrof który apostrof przecinek apostrof chcemy apostrof przecinek apostrof Przykładowy apostrof przecinek apostrof uporządkować apostrof zamknij nawias kwadratowy.

Metoda split() dzieli ciąg znaków na podciągi, wykorzystując znaki białe (spacje, tabulatory) i zwraca ich listę. Listę sortujemy, wskazując w argumencie key jako kryterium funkcję len(), która zwraca ich długość.

Ćwiczenie 3

Zmień  wywołania funkcji sorted(), tak aby odwrócić porządek sortowania.

R1Pn8K3Q3H95O

Wynik działania programu:

Linia 1. otwórz nawias kwadratowy 1 przecinek 3 przecinek 5 przecinek 7 przecinek 9 przecinek 2 przecinek 4 przecinek 6 przecinek 8 przecinek 10 zamknij nawias kwadratowy. Linia 2. otwórz nawias kwadratowy apostrof tekst apostrof przecinek apostrof który apostrof przecinek apostrof chcemy apostrof przecinek apostrof Przykładowy apostrof przecinek apostrof uporządkować apostrof zamknij nawias kwadratowy.

Argumentu key często używa się do porządkowania danych składających się z wielu wartości. Jedna z wartości wybrana zostaje jako klucz sortowania. Takie dane zapisane mogą być w różnych strukturach, np. w krotkach lub słownikach, mogą również być atrybutami obiektów będących instancjami klas użytkownika.

Poniżej pokażemy przykłady sortowania danych uczniów składających się z imion i wieku niemalejąco według wieku ucznia.

Przykład 4

Zacznijmy od przykładu, w którym dane uczniów zapisano w krotkach. Listę krotek sortujemy w porządku niemalejącym wg założonego kryterium, tj. według wieku uczniów.

Linia 1. krotki znak równości otwórz nawias kwadratowy. Linia 2. otwórz nawias okrągły apostrof Adam apostrof przecinek 16 zamknij nawias okrągły przecinek. Linia 3. otwórz nawias okrągły apostrof Ewa apostrof przecinek 18 zamknij nawias okrągły przecinek. Linia 4. otwórz nawias okrągły apostrof Anna apostrof przecinek 19 zamknij nawias okrągły przecinek. Linia 5. otwórz nawias okrągły apostrof Anna apostrof przecinek 17 zamknij nawias okrągły przecinek. Linia 6. otwórz nawias okrągły apostrof Piotr apostrof przecinek 16 zamknij nawias okrągły. Linia 7. zamknij nawias kwadratowy. Linia 9. print otwórz nawias okrągły sorted otwórz nawias okrągły krotki przecinek key znak równości lambda uczen dwukropek uczen otwórz nawias kwadratowy 1 zamknij nawias kwadratowy zamknij nawias okrągły zamknij nawias okrągły.

Sortowane krotki przekazywane są do funkcji anonimowej (lambda), która jako klucz zwraca ich drugi element (uczen[1]), tj. wiek ucznia.

Wynik działania programu:

Linia 1. otwórz nawias kwadratowy otwórz nawias okrągły apostrof Adam apostrof przecinek 16 zamknij nawias okrągły przecinek otwórz nawias okrągły apostrof Piotr apostrof przecinek 16 zamknij nawias okrągły przecinek otwórz nawias okrągły apostrof Anna apostrof przecinek 17 zamknij nawias okrągły przecinek otwórz nawias okrągły apostrof Ewa apostrof przecinek 18 zamknij nawias okrągły przecinek otwórz nawias okrągły apostrof Anna apostrof przecinek 19 zamknij nawias okrągły zamknij nawias kwadratowy.
Przykład 5

W kolejnym przykładzie imiona i wiek uczniów zapisane są w słownikach. Listę słowników porządkujemy niemalejąco według wieku uczniów.

Linia 1. slowniki znak równości otwórz nawias kwadratowy. Linia 2. otwórz nawias klamrowy apostrof imie apostrof dwukropek apostrof Adam apostrof przecinek apostrof wiek apostrof dwukropek 16 zamknij nawias klamrowy przecinek. Linia 3. otwórz nawias klamrowy apostrof imie apostrof dwukropek apostrof Ewa apostrof przecinek apostrof wiek apostrof dwukropek 18 zamknij nawias klamrowy przecinek. Linia 4. otwórz nawias klamrowy apostrof imie apostrof dwukropek apostrof Anna apostrof przecinek apostrof wiek apostrof dwukropek 19 zamknij nawias klamrowy przecinek. Linia 5. otwórz nawias klamrowy apostrof imie apostrof dwukropek apostrof Anna apostrof przecinek apostrof wiek apostrof dwukropek 17 zamknij nawias klamrowy przecinek. Linia 6. otwórz nawias klamrowy apostrof imie apostrof dwukropek apostrof Piotr apostrof przecinek apostrof wiek apostrof dwukropek 16 zamknij nawias klamrowy. Linia 7. zamknij nawias kwadratowy. Linia 9. print otwórz nawias okrągły sorted otwórz nawias okrągły slowniki przecinek key znak równości lambda uczen dwukropek uczen otwórz nawias kwadratowy apostrof wiek apostrof zamknij nawias kwadratowy zamknij nawias okrągły zamknij nawias okrągły.

Do funkcji anonimowej przekazywany jest każdy słownik w zmiennej uczen. Wyrażenie uczen["wiek"] pozwala wskazać wiek ucznia, który zostaje wykorzystany jako klucz sortowania.

Wynik działania programu:

Linia 1. otwórz nawias kwadratowy otwórz nawias klamrowy apostrof imie apostrof dwukropek apostrof Adam apostrof przecinek apostrof wiek apostrof dwukropek 16 zamknij nawias klamrowy przecinek otwórz nawias klamrowy apostrof imie apostrof dwukropek apostrof Piotr apostrof przecinek apostrof wiek apostrof dwukropek 16 zamknij nawias klamrowy przecinek otwórz nawias klamrowy apostrof imie apostrof dwukropek apostrof Anna apostrof przecinek apostrof wiek apostrof dwukropek 17 zamknij nawias klamrowy przecinek otwórz nawias klamrowy apostrof imie apostrof dwukropek apostrof Ewa apostrof przecinek apostrof wiek apostrof dwukropek 18 zamknij nawias klamrowy przecinek otwórz nawias klamrowy apostrof imie apostrof dwukropek apostrof Anna apostrof przecinek apostrof wiek apostrof dwukropek 19 zamknij nawias klamrowy zamknij nawias kwadratowy.
Przykład 6

Ostatni przykład pokazuje sortowanie listy obiektów utworzonych na podstawie klasy Uczen, która ma dwa atrybuty, czyli imiewiek. Listę obiektów porządkujemy niemalejąco według wieku ucznia.

Linia 1. class Uczen dwukropek. Linia 2. def podkreślnik podkreślnik init podkreślnik podkreślnik otwórz nawias okrągły self przecinek imie przecinek wiek zamknij nawias okrągły dwukropek. Linia 3. self kropka imie znak równości imie. Linia 4. self kropka wiek znak równości wiek. Linia 6. def podkreślnik podkreślnik repr podkreślnik podkreślnik otwórz nawias okrągły self zamknij nawias okrągły dwukropek. Linia 7. return self kropka imie plus apostrof apostrof plus str otwórz nawias okrągły self kropka wiek zamknij nawias okrągły. Linia 9. obiekty znak równości otwórz nawias kwadratowy. Linia 10. Uczen otwórz nawias okrągły apostrof Adam apostrof przecinek 16 zamknij nawias okrągły przecinek. Linia 11. Uczen otwórz nawias okrągły apostrof Ewa apostrof przecinek 18 zamknij nawias okrągły przecinek. Linia 12. Uczen otwórz nawias okrągły apostrof Anna apostrof przecinek 19 zamknij nawias okrągły przecinek. Linia 13. Uczen otwórz nawias okrągły apostrof Anna apostrof przecinek 17 zamknij nawias okrągły przecinek. Linia 14. Uczen otwórz nawias okrągły apostrof Piotr apostrof przecinek 16 zamknij nawias okrągły. Linia 15. zamknij nawias kwadratowy. Linia 17. print otwórz nawias okrągły sorted otwórz nawias okrągły obiekty przecinek key znak równości lambda uczen dwukropek uczen kropka wiek zamknij nawias okrągły zamknij nawias okrągły.

Podobnie jak w poprzednich przykładach w funkcji anonimowej, do której trafia każdy obiekt w zmiennej uczen, możemy wskazać kryterium sortowania, tj. atrybut związany z wiekiem: uczen.wiek.

W definicji klasy metoda specjalna __repr__() wykorzystywana jest do zwrócenia reprezentacji obiektu, w tym przypadku do wypisania jego atrybutów, tj. imienia i wieku ucznia.

Wynik działania programu:

Linia 1. otwórz nawias kwadratowy Adam 16 przecinek Piotr 16 przecinek Anna 17 przecinek Ewa 18 przecinek Anna 19 zamknij nawias kwadratowy.

Podczas sortowania możemy również używać funkcji porównującej (komparatora), która powinna zwracać wartość mniejszą od 0, jeżeli pierwszy element jest mniejszy od drugiego; wartość większą od 0, w przeciwnym przypadku lub wartość 0, kiedy elementy są równe. Użycie funkcji porównującej daje nam możliwość określania własnych reguł, które decydują, który z dwóch elementów uznajemy za większy.

Do wskazania funkcji porównującej w argumencie key wykorzystujemy funkcję cmp_to_key() z modułu functools. Jej argumentem jest nazwa funkcji porównującej.

Przykład 7

Oto przykład użycia funkcji cmp_to_key() do wskazania funkcji porównującej o nazwie porownaj() dla argumentu key:

Linia 1. from functools import cmp podkreślnik to podkreślnik key. Linia 3. def porownaj otwórz nawias okrągły a przecinek b zamknij nawias okrągły dwukropek. Linia 4. print otwórz nawias okrągły cudzysłów Porównuję dwukropek cudzysłów przecinek a przecinek cudzysłów i cudzysłów przecinek b przecinek end znak równości cudzysłów cudzysłów zamknij nawias okrągły. Linia 5. if a procent 2 znak równości znak równości 1 and b procent 2 znak równości znak równości 0 dwukropek. Linia 6. print otwórz nawias okrągły cudzysłów Zwracam minus 1 cudzysłów zamknij nawias okrągły. Linia 7. return minus 1. Linia 8. print otwórz nawias okrągły cudzysłów Zwracam 1 cudzysłów zamknij nawias okrągły. Linia 9. return 1. Linia 11. lista znak równości otwórz nawias kwadratowy 1 przecinek 2 przecinek 3 przecinek 4 przecinek 5 przecinek 6 zamknij nawias kwadratowy. Linia 12. print otwórz nawias okrągły sorted otwórz nawias okrągły lista przecinek key znak równości cmp podkreślnik to podkreślnik key otwórz nawias okrągły porownaj zamknij nawias okrągły zamknij nawias okrągły zamknij nawias okrągły.

Wynik działania programu:

Linia 1. Porównuję dwukropek 2 i 1 Zwracam 1. Linia 2. Porównuję dwukropek 3 i 2 Zwracam minus 1. Linia 3. Porównuję dwukropek 3 i 2 Zwracam minus 1. Linia 4. Porównuję dwukropek 3 i 1 Zwracam 1. Linia 5. Porównuję dwukropek 4 i 3 Zwracam 1. Linia 6. Porównuję dwukropek 4 i 2 Zwracam 1. Linia 7. Porównuję dwukropek 5 i 2 Zwracam minus 1. Linia 8. Porównuję dwukropek 5 i 3 Zwracam 1. Linia 9. Porównuję dwukropek 6 i 5 Zwracam 1. Linia 10. Porównuję dwukropek 6 i 4 Zwracam 1. Linia 11. otwórz nawias kwadratowy 1 przecinek 3 przecinek 5 przecinek 2 przecinek 4 przecinek 6 zamknij nawias kwadratowy.

Wypisywane komunikaty oznaczają, że funkcja porownaj() otrzymuje pary liczb, które mają być uporządkowane. Funkcja zwraca wartość -1, jeżeli warunek a % 2 == 1 and b % 2 == 0 jest prawdziwy, czyli pierwsza liczba (a) jest parzysta i mniejsza od drugiej liczby parzystej (b), która jest większa. W pozostałych przypadkach zwracana jest wartość 1, co oznacza, że pierwsza liczba (a) jest większa.

W efekcie otrzymujemy listę, w której na początku znajdują się uporządkowane niemalejąco liczby nieparzyste, a potem również uporządkowane niemalejąco liczby parzyste.

list.sort()

Biblioteka standardowa zawiera również definicję funkcji sort() dostępnej jako metoda każdej listy. Metoda ta nie zawraca nowej listy, natomiast modyfikuje kolejność elementów listy, na rzecz której jest wywoływana. Wykorzystuje wspominany już algorytm stabilnego sortowania hybrydowego TimsorttimsortTimsort.

W metodzie sort() możemy korzystać z dwóch opcjonalnych nazwanych argumentów, tj. reverse oraz key. Ich działanie jest takie samo jak w przypadku funkcji sorted(). Poniżej zamieszczamy kilka przykładów.

Przykład 8

Domyślne sortowanie listy liczb całkowitych niemalejąco z użyciem metody sort(), która modyfikuje początkową listę.

Linia 1. lista znak równości otwórz nawias kwadratowy 5 przecinek 8 przecinek minus 3 przecinek 1 przecinek 10 przecinek 3 kropka 14 przecinek 18 zamknij nawias kwadratowy. Linia 2. lista kropka sort otwórz nawias okrągły zamknij nawias okrągły. Linia 3. print otwórz nawias okrągły lista zamknij nawias okrągły.

Wynik działania programu:

Linia 1. otwórz nawias kwadratowy minus 3 przecinek 1 przecinek 3 kropka 14 przecinek 5 przecinek 8 przecinek 10 przecinek 18 zamknij nawias kwadratowy.
Przykład 9

Sortowania listy liczb całkowitych nierosnąco z użyciem metody sort(). Dodatkowy argument reverse ustawiony na wartość True pozwala uzyskać sortowanie nierosnące.

Linia 1. lista znak równości otwórz nawias kwadratowy 5 przecinek 8 przecinek minus 3 przecinek 1 przecinek 10 przecinek 3 kropka 14 przecinek 18 zamknij nawias kwadratowy. Linia 2. lista kropka sort otwórz nawias okrągły reverse znak równości True zamknij nawias okrągły. Linia 3. print otwórz nawias okrągły lista zamknij nawias okrągły.

Wynik działania programu:

Linia 1. otwórz nawias kwadratowy 18 przecinek 10 przecinek 8 przecinek 5 przecinek 3 kropka 14 przecinek 1 przecinek minus 3 zamknij nawias kwadratowy.
Przykład 10

Sortowanie listy liczb całkowitych nierosnąc0 z użyciem metody sort(). Podobnie jak w przypadku omawianej wyżej funkcji sorted(), w przykładzie używamy dodatkowego argumentu key i funkcji anonimowej lambda. Funkcja zwraca wartość True, jeżeli sortowana liczba jest parzysta, co oznacza, że należy traktować ją jako większą niż liczba nieparzysta, dla której funkcja zwraca wartość False. W ten sposób uzyskamy takie samo uporządkowanie jak w omawianym wyżej przykładzie użycia własnej funkcji porównującej, tzn. wartości uporządkowane zostaną niemalejąco, ale na początku znajdą się liczby nieparzyste, a potem parzyste.

Linia 1. lista znak równości otwórz nawias kwadratowy 1 przecinek 2 przecinek 3 przecinek 4 przecinek 5 przecinek 6 przecinek 7 przecinek 8 przecinek 9 przecinek 10 zamknij nawias kwadratowy. Linia 2. lista kropka sort otwórz nawias okrągły key znak równości lambda x dwukropek x procent 2 znak równości znak równości 0 zamknij nawias okrągły. Linia 3. print otwórz nawias okrągły lista zamknij nawias okrągły.

Wynik działania programu:

Linia 1. otwórz nawias kwadratowy 1 przecinek 3 przecinek 5 przecinek 7 przecinek 9 przecinek 2 przecinek 4 przecinek 6 przecinek 8 przecinek 10 zamknij nawias kwadratowy.
Już wiesz

Funkcja sorted() jest przydatna, gdy chcemy uzyskać posortowaną kopię listy. Metody sort() użyjemy, kiedy chcemy posortować listę początkową, bez tworzenia jej kopii.

Słownik

biblioteka standardowa
biblioteka standardowa

biblioteka dostarczana z kompilatorem lub interpreterem danego języka programowania, zawierająca jego podstawowe funkcje i typy danych

funkcja wbudowana
funkcja wbudowana

funkcje danego języka programowania dostępne dla programisty w dowolnym momencie wykonywania programu

funkcja anonimowa
funkcja anonimowa

definicja funkcji bez nazwy, której używa się zazwyczaj raz; w języku Python używa się składni: lambda argumenty: wyrażenie; funkcja może mieć wiele argumentów, natomiast tylko jedno wyrażenie, którego wynik zwraca

kontener danych
kontener danych

złożona struktura danych służąca do przechowywania obiektów udostępniająca metody pozwalające na dodawanie, odczytywanie, usuwanie, modyfikowanie czy wyszukiwanie danych, przykładem może być tablica lub lista

obiekt
obiekt

instancja jakiejś klasy definiującej złożony typ danych, zawiera pola z danymi (atrybuty) oraz funkcje wykonujące operacje na tych danych, zwane metodami

timsort
timsort

stabilny algorytm sortowania łączący cechy sortowania przez wstawianie i przez scalanie; wyszukuje w danych już posortowane sekwencje i wykorzystuje je do wydajniejszego sortowania pozostałych danych

stabilny algorytm sortowania
stabilny algorytm sortowania

algorytm stabilny podczas porządkowania dwóch takich samych elementów zachowuje ich porządek wejściowy w uporządkowanym zbiorze wynikowym, algorytm niestabilny nie gwarantuje zachowania takiego porządku