Sortowanie Przez Wstrząsanie to algorytm, który porządkuje dane i jego zasada działania opiera się o algorytm Sortowania Bąbelkowego. W tym przypadku jednak nie przechodzi się po elementach tylko w jedną stronę, ale po dotarciu na koniec nieposortowanej części należy przejść do tyłu ponownie wykonując zamiany jeśli zajdzie taka potrzeba. W ten sposób większe oraz mniejsze elementy są coraz bliżej ich ostatecznego położenia.
Przypuśćmy, że mamy daną tablicę tab o długości n. Wtedy, aby ją posortować należy:
Weźmy listę L:={5, 2, 3, 6, 4, 1} kolejno będą wykonywane następujące porównania:
Lista | Porównanie | Komentarz |
---|---|---|
{5, 2, 3, 6, 4, 1} | 5 > 2 | zamiana elementów |
{2, 5, 3, 6, 4, 1} | 5 > 3 | zamiana elementów |
{2, 3, 5, 6, 4, 1} | 5 > 6 | - |
{2, 3, 5, 6, 4, 1} | 6 > 4 | zamiana elementów |
{2, 3, 5, 4, 6, 1} | 6 > 1 | zamiana elementów oraz zmiana kierunku sortowania |
{2, 3, 5, 4, 1, 6} | 1 < 4 | zamiana elementów |
{2, 3, 5, 1, 4, 6} | 1 < 5 | zamiana elementów |
{2, 3, 1, 5, 4, 6} | 1 < 3 | zamiana elementów |
{2, 1, 3, 5, 4, 6} | 1 < 2 | zamiana elementów |
{1, 2, 3, 5, 4, 6} | 2 > 3 | - |
{1, 2, 3, 5, 4, 6} | 3 > 5 | - |
{1, 2, 3, 5, 4, 6} | 5 > 4 | zamiana elementów oraz zmiana kierunku sortowania |
{1, 2, 3, 4, 5, 6} | 4 < 3 | - |
{1, 2, 3, 4, 5, 6} | 3 < 2 | - |
{1, 2, 3, 4, 5, 6} | 3 > 4 | zmiana kierunku sortowania |
{1, 2, 3, 4, 5, 6} | - | Lista jest posortowana |
W powyższym schemacie porównywane elementy zostały na liście wyróżnione pogrubieniem, a elementy już na odpowiednim miejscu zostały zaznaczone zostały pochyleniem. Po wykonaniu wszystkich wymienionych kroków otrzymujemy posortowaną listę L:={1, 2, 3, 4, 5, 6}.
Szacuje się, że złożoność algorytmu Sortowania Przez Wstrząsanie jest lepsza niż w przypadku sortowania bąbelkowego, ale wciąż O(n2). Co wynika z faktu, że podczas każdego przejścia jest kolejno wykonywane n - 1 porównań, n - 2, .., 1. Najlepszy przypadek to O(n), który występuje gdy lista jest już posortowana. Złożoność pamięciowa rozwiązania wynosi O(1).
Funkcja sortuj() sortuje przekazaną tablicę tab zgodnie z ideą Sortowania Przez Wstrząsanie.
Na początek (2.) ustalamy, że cała tablica jest nie posortowana i (3.) deklarujemy zmienną zamiana - dzięki niej będzie można ograniczyć liczbę potrzebnych zamian. Następnie (4.) dopóki tablica nie jest posortowana to: (5. - 11.) sortujemy wszystkie pary elementów począwszy od pierwszego nieposortowanego i (12.) zmniejszamy prawy zakres, ponieważ na końcu jest już największy element (w nieposortowanej części tablicy). Następnie analogicznie wykonujemy (13. - 18.) sortowanie cofając się i (19.) zwiększamy lewy zakres. Jeśli został zamieniona chociaż jedna para elementów to zmianna zamiana ma wartość prawda. Wtedy należy jeszcze raz przejść przez listę, aby mieć pewność, że lista została posortowana.
Napisaną funkcję sortującą można przetestować poniższym kodem, który wczyta od użytkownika tablicę, a następnie ją posortuje rosnąco.
Napisz funkcję sortującą opartą na Sortowaniu Przez Wstrząsanie po wywołaniu której na liście bedą kolejno posortowane rosnąco wszystkie liczby parzyste, a następnie liczby nieparzyste. Przetestuj działanie funkcji dla różnych list.
Przykładowo napisana funkcja dla listy liczb: {5, 2, 1, 4, 3} wypisze na ekran: