Algorytmy sortowania – właściwości

Mówiąc o algorytmach sortowaniasortowanie stabilnesortowania, powinniśmy pamiętać o tym, jak można je scharakteryzować oraz ze względu na co podzielić.

Możemy wyróżnić działania, na których bazuje większość algorytmów sortowania, które poznamy – są to np.: wstawianie, zamiana, wybór oraz łączenie. Algorytmy najczęściej wykorzystują kilka z nich.

Sortowanie w miejscu

Algorytmy sortowania, które sortują w miejscu (in situ) to takie algorytmy, które niezależnie od tego, jaki jest rozmiar danych wejściowych, do wykonania sortowania potrzebują stałej ilości pamięci komputera.

Przykład 1

Przykłady algorytmów sortowania, które sortują dane w miejscu: sortowanie przez wybieraniePT5YE0lsBsortowanie przez wybieranie, sortowanie przez wstawianiePJ4y2qWoXsortowanie przez wstawianie, sortowanie bąbelkowePCfvfjgLksortowanie bąbelkowe, sortowanie szybkiePpzx1Yyemsortowanie szybkie.

Przykład 2

Przykłady algorytmów sortowania, które nie sortują danych w miejscu: sortowanie kubełkowePPpmzST7zsortowanie kubełkowe, sortowanie pozycyjne (np. sortowanie pozycyjne datPdHgCW7uUsortowanie pozycyjne dat, sortowanie pozycyjne liczbPjBWIbxmPsortowanie pozycyjne liczb, sortowanie pozycyjne słówPXnUDqfi5sortowanie pozycyjne słów), sortowanie przez zliczaniePNx8quWZlsortowanie przez zliczanie, sortowanie przez scalaniePNHdnGJ4Isortowanie przez scalanie.

Algorytmy iteracyjne i rekurencyjne

Niektóre z algorytmów sortowania wykorzystują rekurencję. Może to powodować sytuację, w której ich wykorzystanie jest ograniczone, np. dla przypadku pesymistycznego algorytm sortowania szybkiego ma kwadratową złożoność.

Przykład 3

Przykłady algorytmów sortowania, które wykorzystują rekurencję: sortowanie przez scalaniePNHdnGJ4Isortowanie przez scalanie, sortowanie szybkiePpzx1Yyemsortowanie szybkie.

Inne algorytmy wykorzystują techniki iteracyjne, to jest pętle, których celem jest powtarzanie bloków instrukcji aż do spełnienia pewnego warunku.

Przykład 4

Przykłady algorytmów sortowania, które wykorzystują iterację: sortowanie przez wybieraniePT5YE0lsBsortowanie przez wybieranie, sortowanie przez wstawianiePJ4y2qWoXsortowanie przez wstawianie, sortowanie bąbelkowePCfvfjgLksortowanie bąbelkowe, sortowanie kubełkowePPpmzST7zsortowanie kubełkowe, sortowanie pozycyjne (np. sortowanie pozycyjne datPdHgCW7uUsortowanie pozycyjne dat, sortowanie pozycyjne liczbPjBWIbxmPsortowanie pozycyjne liczb, sortowanie pozycyjne słówPXnUDqfi5sortowanie pozycyjne słów), sortowanie przez zliczaniePNx8quWZlsortowanie przez zliczanie.

Algorytmy liniowe i wykorzystujące metodę „dziel i zwyciężaj”

Algorytmy wykorzystujące metodę „dziel i zwyciężaj” składają się z trzech etapów – najpierw należy podzielić problem na podproblemy, następnie znaleźć rozwiązanie dla każdego problemu, a następnie połączyć rozwiązania poszczególnych podproblemów w rozwiązanie problemu głównego. Metoda została dokładniej omówiona w e‑materiale Rozwiązywanie problemów informatycznych – strategia „dziel i zwyciężaj”Pv0IXD75RRozwiązywanie problemów informatycznych – strategia „dziel i zwyciężaj”.

Przykład 5

Przykłady algorytmów sortowania, które wykorzystują metodę „dziel i zwyciężaj”: sortowanie przez scalaniePNHdnGJ4Isortowanie przez scalanie, sortowanie szybkiePpzx1Yyemsortowanie szybkie.

Algorytmy liniowe natomiast przechodzą przez dane sekwencyjnie (element po elemencie) w celu uporządkowania ich w odpowiedniej kolejności

Przykład 6

Przykłady algorytmów sortowania, które przetwarzają dane sekwencyjnie: sortowanie przez wybieraniePT5YE0lsBsortowanie przez wybieranie, sortowanie przez wstawianiePJ4y2qWoXsortowanie przez wstawianie, sortowanie bąbelkowePCfvfjgLksortowanie bąbelkowe, sortowanie kubełkowePPpmzST7zsortowanie kubełkowe, sortowanie pozycyjne (np. sortowanie pozycyjne datPdHgCW7uUsortowanie pozycyjne dat, sortowanie pozycyjne liczbPjBWIbxmPsortowanie pozycyjne liczb, sortowanie pozycyjne słówPXnUDqfi5sortowanie pozycyjne słów), sortowanie przez zliczaniePNx8quWZlsortowanie przez zliczanie.

Algorytmy oparte na porównywaniu i zliczaniu

Wyróżnia się algorytmy sortowania bazujące na porównywaniu elementów oraz zliczaniu ich.

Algorytmy bazujące na porównywaniu elementów określają, czy dany element jest większy, mniejszy od danego innego elementu czy mu równy. Na tej podstawie elementy są zamieniane miejscami, by uporządkować je w odpowiedniej kolejności

Przykład 7

Przykłady algorytmów sortowania, które wykorzystują porównywanie elementów: sortowanie przez wybieraniePT5YE0lsBsortowanie przez wybieranie, sortowanie przez wstawianiePJ4y2qWoXsortowanie przez wstawianie, sortowanie bąbelkowePCfvfjgLksortowanie bąbelkowe, sortowanie przez scalaniePNHdnGJ4Isortowanie przez scalanie, sortowanie szybkiePpzx1Yyemsortowanie szybkie.

Algorytmy wykorzystując zliczanie działają w taki sposób, że zliczają wystąpienia poszczególnych wartości, zamiast porównywać je bezpośrednio. Na podstawie informacji o liczbie wystąpień wartości, elementy są umieszczane na odpowiednich pozycjach.

Przykład 8

Przykłady algorytmów sortowania, które wykorzystują zliczanie elementów: sortowanie kubełkowePPpmzST7zsortowanie kubełkowe, sortowanie pozycyjne (np. sortowanie pozycyjne datPdHgCW7uUsortowanie pozycyjne dat, sortowanie pozycyjne liczbPjBWIbxmPsortowanie pozycyjne liczb, sortowanie pozycyjne słówPXnUDqfi5sortowanie pozycyjne słów), sortowanie przez zliczaniePNx8quWZlsortowanie przez zliczanie.

Stabilność

Algorytmy sortowania stabilnego to takie algorytmy, w których elementy o takiej samej wartości podczas sortowania nie zmieniają kolejności względem siebie.

Przykład 9

Przykłady algorytmów sortowania, które są stabilne: sortowanie przez wstawianiePJ4y2qWoXsortowanie przez wstawianie, sortowanie bąbelkowePCfvfjgLksortowanie bąbelkowe, sortowanie pozycyjne (np. sortowanie pozycyjne datPdHgCW7uUsortowanie pozycyjne dat, sortowanie pozycyjne liczbPjBWIbxmPsortowanie pozycyjne liczb, sortowanie pozycyjne słówPXnUDqfi5sortowanie pozycyjne słów), sortowanie przez zliczaniePNx8quWZlsortowanie przez zliczanie, sortowanie przez scalaniePNHdnGJ4Isortowanie przez scalanie.

Przykład 10

Przykłady algorytmów sortowania, które nie są stabilne: sortowanie przez wybieraniePT5YE0lsBsortowanie przez wybieranie, sortowanie kubełkowePPpmzST7zsortowanie kubełkowe, sortowanie szybkiePpzx1Yyemsortowanie szybkie.

Złożoność obliczeniowa i pamięciowa

Informacje na temat złożoności obliczeniowej oraz pamięciowej znajdziesz w e‑materiałach Jak wybrać odpowiedni algorytm sortowania?PzdpKUcTTJak wybrać odpowiedni algorytm sortowania? oraz Porównanie algorytmów sortowaniaP173pmQg7Porównanie algorytmów sortowania.

Sposób sortowania elementów

Wyrazy sortowanego zbioru mogą być sortowane rosnąco, niemalejąco, malejąco lub nierosnąco. Domyślnym przypadkiem jest sortowanie niemalejące lub rosnące.

Chociaż terminy kolejność niemalejącarosnąca oraz nierosnącamalejąca bywają używane zamiennie, ich znaczenia nie są tożsame.

O sortowaniu rosnącym mówimy wtedy, gdy każdy kolejny posortowany element jest większy od poprzedniego – nie ma równych elementów.

Linia 1. 0 2 5 7 13 16 34 37 51 61.

O sortowaniu niemalejącym mówimy wtedy, gdy każdy kolejny posortowany element jest większy lub równy poprzedniemu (w zbiorze są równe sobie elementy).

Linia 1. 0 2 5 7 7 16 34 51 51 61.

O sortowaniu malejącym mówimy wtedy, gdy każdy kolejny posortowany element jest mniejszy od poprzedniego – nie ma równych elementów.

Linia 1. 61 51 37 34 16 13 7 5 2 0.

O sortowaniu nierosnącym mówimy wtedy, gdy każdy kolejny posortowany element jest mniejszy lub równy poprzedniemu (w zbiorze są równe sobie elementy).

Linia 1. 61 51 51 34 16 7 7 5 2 0.

Podsumowanie

Większość wspomnianych algorytmów opisujemy w e‑materiałach.

Różne właściwości algorytmów mogą być powiązane w różny sposób, a wiele algorytmów można przypisać do kilku kategorii, np. sortowanie szybkie (quicksort) jest algorytmem porównawczym, który wykorzystuje technikę dziel i zwyciężaj i może być zaimplementowany za pomocą iteracji lub rekurencji (choć w e‑materiałach przedstawimy jego rekurencyjną implementację).

Często decyzja o wyborze strategii zależy od konkretnych wymagań i ograniczeń problemu, który próbujemy rozwiązać. O tym, w jaki sposób dobrać algorytm sortowania, przeczytasz w e‑materiale Jak wybrać odpowiedni algorytm sortowania?PzdpKUcTTJak wybrać odpowiedni algorytm sortowania?.

Wyszukiwanie elementu w zbiorze posortowanym i nieposortowanym

Zaprezentujmy na przykładzie, jak ważne jest sortowanie elementów i jak bardzo może usprawnić pracę programu. Porównajmy liczbę operacji, jakie będą musiały zostać wykonane podczas wyszukiwania elementu w zbiorze zarówno posortowanym, jak i nieposortowanym.

Specyfikacja problemu:

Dane:

  • tab – przeszukiwana tablica liczb

  • szukana_liczba – liczba której szukamy

Wynik:

  • informacja, czy szukana_liczba znajduje się w tablicy tab

By porównać przykładową liczbę operacji, działanie programu przetestujemy dla tablicy, w skład której wchodzą następujące liczby: 30, 3, 20, 28, 21, 18, 5, 6, 1, 14.

Będziemy szukać liczby 18.

Wyszukiwanie liniowe – wyszukiwanie w zbiorze nieposortowanym.  Ten algorytm realizowany jest liniowo – element po elemencie. Algorytm będzie prezentował się w następujący sposób:

Linia 1. funkcja wyszukiwanie podkreślnik liniowe otwórz nawias okrągły tab przecinek szukana podkreślnik liczba zamknij nawias okrągły. Linia 2. znaleziono ← fałsz. Linia 3. i ← 0. Linia 4. dopóki znaleziono wykrzyknik znak równości prawda oraz i otwórz nawias ostrokątny długość otwórz nawias okrągły tab zamknij nawias okrągły wykonuj dwukropek. Linia 5. jeśli tab otwórz nawias kwadratowy i zamknij nawias kwadratowy znak równości szukana podkreślnik liczba. Linia 6. wypisz cudzysłów Znaleziono liczbę na pozycji dwukropek cudzysłów i. Linia 7. znaleziono ← prawda. Linia 8. zakończ działanie algorytmu. Linia 9. i ← i plus 1. Linia 12. jeśli znaleziono znak równości fałsz. Linia 13. wypisz cudzysłów Nie znaleziono szukanej liczby cudzysłów.

Przebieg algorytmu dla podanych danych:

  • Inicjalizujemy zmienne.

  • Rozpoczynamy pętlę:

    • tab[0] = 30 - nie jest to szukana liczba, zwiększamy i o 1. Wykonaliśmy 1 porównanie.

    • tab[1] = 3 - nie jest to szukana liczba, zwiększamy i o 1. Wykonaliśmy 2 porównania.

    • tab[2] = 20 - nie jest to szukana liczba, zwiększamy i o 1. Wykonaliśmy 3 porównania.

    • tab[3] = 28 - nie jest to szukana liczba, zwiększamy i o 1. Wykonaliśmy 4 porównania.

    • tab[4] = 21 - nie jest to szukana liczba, zwiększamy i o 1. Wykonaliśmy 5 porównania.

    • tab[5] = 18 - jest to szukana liczba. Wypisujemy Znaleziono liczbę na pozycji: 5. Ustawiamy znaleziono <-- prawda. Wykonaliśmy 6 porównań. Kończymy działanie algorytmu.

Podsumowując, wykonaliśmy 6 porównań wewnątrz pętli i żadnego porównania po pętli.

Wyszukiwanie liniowe z wartownikiem – na końcu przeszukiwanego zbioru dodajemy element równy poszukiwanemu.

Algorytm będzie prezentował się w następujący sposób:

Linia 1. funkcja wyszukiwanie podkreślnik liniowe podkreślnik wartownik otwórz nawias okrągły tab przecinek szukana podkreślnik liczba zamknij nawias okrągły. Linia 2. tab otwórz nawias kwadratowy długość otwórz nawias okrągły tab zamknij nawias okrągły zamknij nawias kwadratowy ← szukana podkreślnik liczba. Linia 3. i ← 0. Linia 5. dopóki tab otwórz nawias kwadratowy i zamknij nawias kwadratowy wykrzyknik znak równości szukana podkreślnik liczba wykonuj dwukropek. Linia 6. i ← i plus 1. Linia 8. jeśli i otwórz nawias ostrokątny długość otwórz nawias okrągły tab zamknij nawias okrągły minus 1 dwukropek. Linia 9. wypisz cudzysłów Znaleziono liczbę na pozycji dwukropek cudzysłów i. Linia 10. w przeciwnym przypadku dwukropek. Linia 11. wypisz cudzysłów Nie znaleziono szukanej liczby cudzysłów.

Przebieg algorytmu dla podanych danych:

  • Inicjalizujemy zmienne (pamiętamy o dodaniu wartownika).

  • Rozpoczynamy pętlę:

    • tab[0] = 30 - nie jest to szukana liczba, zwiększamy i o 1. Wykonaliśmy 1 porównanie.

    • tab[1] = 3 - nie jest to szukana liczba, zwiększamy i o 1. Wykonaliśmy 2 porównania.

    • tab[2] = 20 - nie jest to szukana liczba, zwiększamy i o 1. Wykonaliśmy 3 porównania.

    • tab[3] = 28 - nie jest to szukana liczba, zwiększamy i o 1. Wykonaliśmy 4 porównania.

    • tab[4] = 21 - nie jest to szukana liczba, zwiększamy i o 1. Wykonaliśmy 5 porównania.

    • tab[5] = 18 - jest to szukana liczba. Wykonaliśmy 6 porównań.

  • Po wyjściu z pętli:

    • sprawdzamy warunek i < długość(tab) - 1:

      • i = 5

      • długość(tab) - 1 = 10 (ponieważ długość tablicy wynosi 11 po dodaniu wartownika)

      • Ponieważ 5 < 10, więc wypisujemy Znaleziono liczbę na pozycji: 5.

Podsumowując, wykonaliśmy 6 porównań wewnątrz pętli i 1 porównanie po pętli (porównanie wartości i z wartością długość(tab) - 1).

Wyszukiwanie binarneP1BaMcr5iWyszukiwanie binarne – wyszukiwanie w zbiorze posortowanym. Pierwszym krokiem, jaki musimy wykonać, jest posortowanie zbioru. Jest to wymóg zastosowania wyszukiwania binarnego.

Posortowany zbiór będzie wyglądał następująco: {1, 3, 5, 6, 14, 18, 20, 21, 28, 30}.

Następnie wykonujemy algorytm wyszukiwania binarnego:

Linia 1. funkcja wyszukiwanie podkreślnik binarne otwórz nawias okrągły tab przecinek szukana podkreślnik liczba zamknij nawias okrągły. Linia 2. lewo ← 0. Linia 3. prawo ← długość otwórz nawias okrągły tab zamknij nawias okrągły minus 1. Linia 5. dopóki lewo otwórz nawias ostrokątny znak równości prawo wykonuj dwukropek. Linia 6. i ← otwórz nawias okrągły prawo plus lewo zamknij nawias okrągły prawy ukośnik prawy ukośnik 2. Linia 7. jeżeli tab otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias ostrokątny szukana podkreślnik liczba. Linia 8. lewo ← i plus 1. Linia 9. w innym przypadku. Linia 10. jeżeli tab otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias ostrokątny szukana podkreślnik liczba. Linia 11. prawo otwórz nawias ostrokątny minus i minus 1. Linia 12. w innym przypadku. Linia 13. wypisz cudzysłów Znaleziono liczbę na pozycji dwukropek cudzysłów i. Linia 15. jeżeli lewo zamknij nawias ostrokątny prawo dwukropek. Linia 16. wypisz cudzysłów Nie znaleziono liczby cudzysłów.

Przebieg algorytmu dla podanych danych:

  • Inicjalizujemy zmienne (pamiętamy o dodaniu wartownika).

  • Rozpoczynamy pętlę:

    • i <-- (9 + 0) // 2 to 4,czyli tab[4] = 14.

      • 14 < 18 zatem wykonujemy lewo <-- i + 1, co daje lewo <-- 5. Wykonaliśmy 1 porównanie.

    • i <-- (9 + 5) / 2 to 7. Czyli tab[7] = 21.

      • 21 < 18 zatem wykonujemy prawo <-- i - 1, co daje prawo <-- 6. Wykonaliśmy 2 porównania.

    • i <-- (6 + 5) // 2 to 5,czyli tab[5] = 18. Wypisujemy Znaleziono liczbę na pozycji: 5.

Podsumowując, wykonaliśmy 3 porównania (podziały) wewnątrz pętli.

Zadanie typu maturalnego, które wymaga odnalezienia konkretnego elementu, w którym wykorzystujemy wyszukiwanie liniowego oraz binarne, znajdziesz w e‑materiale Przerywanie pętli – zadania maturalnePHkbTufMAPrzerywanie pętli – zadania maturalne.

Jak widzimy, algorytm wyszukiwania binarnego zadziałał szybciej niż algorytm liniowyPiVb7f8s2algorytm liniowy.

Aby można było skorzystać z algorytmu wyszukiwania binarnego, zbiór danych musi być posortowany. W sytuacji, gdy zbiór, w którym jest niewiele elementów, nie będzie często przeszukiwany (np. chcemy wyłącznie raz sprawdzić, czy znajduje się w nim dany element), metoda liniowa (czyli taka, która nie wymaga od nas wcześniejszego posortowania zbioru) może okazać się w zupełności wystarczająca.

Warto jednak pamiętać, że utrzymywanie dużego posortowanego zbioru danych, w którym często szukamy informacji, jest znacznie korzystniejsze ze względu na czas, jaki zajmuje każde wyszukanie. Nawet jeżeli sam proces sortowania okaże się czasochłonny – wykonamy go tylko raz, za to zaoszczędzimy sporo czasu na wielokrotnym przeszukiwaniu zbioru. Dlatego też tak ważna jest znajomość i umiejętność skutecznego użycia podstawowych algorytmów sortowania.

Słownik

inicjalizacja
inicjalizacja

w programowaniu: nadanie wartości początkowych

instrukcja warunkowa
instrukcja warunkowa

element algorytmu pozwalający na sprawdzenie jednego lub kilku warunków, a następnie zdefiniowanie, jakie czynności mają być wykonane, jeśli dane warunki są spełnione lub niespełnione (służy do sterowania programem)

sortowanie
sortowanie

proces polegający na porządkowaniu zbioru elementów według ich wybranych cech

sortowanie w miejscu
sortowanie w miejscu

inaczej in situ; sortowanie, w którym niezależnie od rozmiaru danych wejściowych potrzebna jest stała ilość pamięci komputera

sortowanie stabilne
sortowanie stabilne

sortowanie, w którym elementy o takiej samej wartości nie zmienią pozycji względem siebie

złożoność obliczeniowa
złożoność obliczeniowa

ilość zasobów komputerowych potrzebnych do wykonania zadania

złożoność czasowa
złożoność czasowa

ilość czasu potrzebnego do wykonania zadania, wyrażona jako funkcja ilości danych