Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Materiały pochodzą z Platformy Edukacyjnej Portalu

Podobne prezentacje


Prezentacja na temat: "Materiały pochodzą z Platformy Edukacyjnej Portalu"— Zapis prezentacji:

1 Materiały pochodzą z Platformy Edukacyjnej Portalu www.szkolnictwo.pl
Wszelkie treści i zasoby edukacyjne publikowane na łamach Portalu mogą być wykorzystywane przez jego Użytkowników wyłącznie w zakresie własnego użytku osobistego oraz do użytku w szkołach podczas zajęć dydaktycznych. Kopiowanie, wprowadzanie zmian, przesyłanie, publiczne odtwarzanie i wszelkie wykorzystywanie tych treści do celów komercyjnych jest niedozwolone. Plik można dowolnie modernizować na potrzeby własne oraz do wykorzystania w szkołach podczas zajęć dydaktycznych.

2 Algorytmy sortujące Algorytm Shella

3 Wiadomości ogólne Sortowanie Shella (ang. Shell sort) – jest to algorytm, który jest uogólnieniem metody sortowania przez wstawianie. Metodę tę nazwano także metodą malejących przyrostów. Został opisany po raz pierwszy w latach 50. XX wieku przez amerykańskiego informatyka Donalda Shella. Zauważył on, że algorytm przez wstawianie pracuje bardzo efektywnie w przypadku gdy zbiór jest w dużym stopniu uporządkowany. Natomiast, algorytm ten jest nieefektywny dla zbiorów nieuporządkowanych, ponieważ elementy są przesuwane w każdym obiegu o jedną pozycję przy wstawianiu elementu wybranego na listę uporządkowaną. Pomysł Shella polegał na tym, iż sortowany zbiór podzielił na podzbiory, których elementy są odległe od siebie w sortowanym zbiorze o pewien odstęp h. Każdy z tych podzbiorów posortował algorytmem przez wstawianie. Następnie zmniejszył odstęp. Dzięki temu powstal nowy podzbiór (będzie ich już mniej). Sortowanie powtarzał i ponownie zmniejszał odstęp, do momentu aż osiągnie on wartość 1.

4 Wiadomości ogólne Kiedy odstęp h będzie równy 1, sortujemy za pomocą sortowania przez wstawianie (Instertion Sort). Jednakże z uwagi na wcześniejsze obiegi sortujące mamy ułatwione zadanie, ponieważ zbiór został w dużym stopniu uporządkowany. Dzięki początkowym dużym odstępom elementy były przesuwane w zbiorze bardziej efektywnie - na duże odległości. W wyniku otrzymujemy najlepszy pod względem szybkości czasu wykonania algorytm sortujący w klasie O(n2). Algorytm ten nosi również nazwę algorytmu sortowania przez wstawianie z malejącym odstępem (ang. Diminishing Increment Sort). Efektywność algorytmu sortowania metodą Shella zależy w dużym stopniu od ciągu przyjętych odstępów. Pierwotnie Shell proponował pierwszy odstęp równy połowie liczby elementów w sortowanym zbiorze. Kolejne odstępy otrzymujemy dzieląc odstęp przez 2 (dzielenie całkowitoliczbowe).

5 Przykład 1 Posortujemy metodą Shella zbiór ośmiu liczb: [ ] w porządku rosnącym. Zbiór posiada osiem elementów, dlaltego przyjmiemy na wstępie odstęp h równy 4. Taki odstęp podzieli zbiór na 4 podzbiory, których elementy będą elementami zbioru wejściowego odległymi od siebie o 4 pozycje. Każdy z otrzymanych podzbiorów sortujemy algorytmem sortowania przez wstawianie. Ponieważ zbiory są dwuelementowe, to sortowanie będzie polegało na porównaniu pierwszego elementu podzbioru z elementem drugim i ewentualną zamianę ich miejsc, jeśli będą w niewłaściwym porządku. podział, h=4 sortowanie wynik 5 2 9 6 7 3 8 1 - zbiór wejściowy 4 zbiór wyjściowy -

6 Przykład 1 cd. Teraz zmniejszamy odstęp h o połowę, czyli h=2. Zbiór podstawowy zostanie podzielony na dwa podzbiory. Każdy z nich sortujemy przez wstawianie: podział, h=2 sortowanie wynik 5 2 8 1 7 3 9 6 - zbiór wejściowy zbiór wyjściowy -

7 Przykład 1 cd. Kolejnym krokiem będzie zmniejszenie odstęp h o połowę, h = 1. Taki odstęp nie dzieli zbioru wejściowego na podzbiory, więc teraz będzie sortowany przez wstawianie cały zbiór. Algorytm sortujący ma ułatwioną pracę, ponieważ dzięki poprzednim dwóm obiegom zbiór został częściowo uporządkowany - elementy małe zbliżyły się do początku zbioru, a elementy duże do jego końca. podział, h=1 sortowanie wynik 5 1 7 2 8 3 9 6 - zbiór wejściowy zbiór wyjściowy -

8 Przykład 2 Posortujemy metodą Shella zbiór dziesięciu liczb: [ ] w porządku rosnącym, przyjmując na wstępie odstęp h równy 3. podział, h=3 sortowanie 1 22 67 7 99 75 44 9 23 14 - zbiór wejściowy 2 3 wynik 1 7 14 44 9 22 99 23 67 75 - zbiór wyjściowy

9 Przykład 2 cd. W kolejnym kroku zmniejszamy różnicę pomiędzy elementami do 2. pozycji i sortujemy powstałe 2 podzbiory. podział, h=2 sortowanie 1 9 23 7 22 67 14 99 75 44 - zbiór wejściowy 2 wynik 1 14 22 23 75 7 9 44 67 99 - zbiór wyjściowy

10 Przykład 2 cd. Zmniejszamy odstęp h o połowę, h = 1. Taki odstęp już nie dzieli zbioru wejściowego na podzbiory, dlatego będzie sortowany przez wstawianie cały zbiór. Dzięki poprzednim dwóm obiegom zbiór został częściowo uporządkowany - elementy małe zbliżyły się do początku zbioru, a elementy duże do jego końca, dzięki czemu algorytm ma ułatwione zadanie. podział, h=1 1 7 14 9 22 44 23 67 75 99 - zbiór wejściowy sortowanie 1 7 9 14 22 23 44 67 75 99 wynik 1 7 9 14 22 23 44 67 75 99 - zbiór wyjściowy Koniec sortowania, zbiór został uporządkowany.

11 Dobór optymalnych odstępów
Zwiększenie efektywności algorytmu Shella w stosunku do zwykłego sortowania przez wstawianie - algorytm porządkowania przez wstawianie jest efektywny dla częściowo uporządkowanych zbiorów. Sortując małe podzbiory, częściowo porządkujemy dany zbiór, tak że w ostatnim kroku jest on już częściowo prawidłowo poukładany. Tak więc liczba zamian jest stosunkowo mała. Wpływ na efektywność w metodzie malejących przyrostów ma także wartość samego przyrostu. Badania wykazały, że lepsza efektywność algorytmu występuje w przypadku, gdy przyrosty nie są swoimi dzielnikami oraz potęgami liczby 2. Bardzo ważnym elementem, który wpływa na efektywność sortowania metodą Shella jest odpowiednie dobranie ciągu odstępów. Pierwotnie Shell proponował pierwszy odstęp równy połowie liczby elementów w sortowanym zbiorze, kolejne odstępy otrzymuje się dzieląc odstęp przez 2. W praktyce, okazało się, że zaproponowany ciąg odstępów przez Shella jest jednym z najgorszych, ponieważ w kolejnych podzbiorach uczestniczą wielokrotnie te same elementy.

12 Optymalny odstęp Knutha
Dotąd problem optymalnych odstępów w algorytmie sortowania metoda Shella nie został rozwiązany matematycznie, ponieważ w ogólnym przypadku jest niezwykle skomplikowany. Wielu naukowców proponowało na wybór tych odstępów różne ciągi liczbowe, w wyniku czego otrzymywano lepsze lub gorsze rezultaty. Prof. Donald Knuth (ur. 1938) Jednym z naukowców, który badał ten problem jest amerykański matematyk, informatyk, emerytowany profesor na katedrze informatyki Uniwersytetu Stanforda Donald Knuth. Zbadał on bardzo dokładnie algorytm sortowania metodą Shella i doszedł do wniosku, iż dobry ciąg odstępów dla n elementowego zbioru można wyznaczyć następująco: przyjmujemy h1 = 1 obliczamy hs = 3hs aż do momentu gdy hs ≥ n ostatecznie h = [hs : 9]

13 Przykład 3 Obliczmy pierwszy odstęp dla zbioru o n = 200 elementach: h1 = 1 h2 = 3h1 + 1 = = 4 - mniejsze od 200, kontynuujemy h3 = 3h2 + 1 = = 13 – kontynuujemy h4 = 3h3 + 1 = = 40 – kontynuujemy h5 = 3h4 + 1 = = 121 – kontynuujemy h6 = 3h5 + 1 = = stop, ponieważ jest większe od 200 h = [h6 : 9] = [364 : 9] = [40 4/9] = 40 Kolejne odstępy obliczamy dzieląc całkowitoliczbowo bieżący odstęp przez 3. Taki właśnie sposób wyliczania odstępów przyjmiemy w przykładowym algorytmie.

14 Specyfikacja problemu
Dane wejściowe n - liczba elementów w sortowanym zbiorze, n  N d[ ] - zbiór n - elementowy, który będzie sortowany. Elementy zbioru mają indeksy od 1 do n. Dane wyjściowe d[ ] - posortowany zbiór n - elementowy Elementy zbioru mają indeksy od 1 do n Zmienne pomocnicze i - indeks elementu listy uporządkowanej i  N j - zmienna sterująca pętli j  N h - odstęp pomiędzy kolejnymi elementami podzbiorów, h  N x - zawiera wybrany ze zbioru element

15 Lista kroków K01: h ← 1 K02: Powtarzaj h ← 3h + 1, aż h ≥ n K03: h ← h div 9 K04: Jeśli h = 0, to h ← 1 K05: Dopóki h > 0: wykonuj K06...K10 K06: Dla j = n - h, n - h - 1, ..., 1: wykonuj K07...K09 K07: x ← d[j]; i ← j + h K08: Dopóki (i ≤ n) i (x > d[i]): wykonuj d[i - h] ← d[i]; i ← i + h K09: d[i - h] ← x K10: h ← h div 3 K11: Zakończ

16 Schemat blokowy Algorytm sortowania metodą Shella jest ulepszonym algorytmem sortowania przez wstawianie. Aby się o tym przekonać, wystarczy spojrzeć na schemat blokowy. Kolorem szarym zaznaczone zostały bloki, które dokładnie odpowiadają algorytmowi sortowania przez wstawianie. Jedyną modyfikacją jest wprowadzenie odstępu h zamiast liczby 1. Na początku algorytmu wyznaczamy wartość początkowego odstępu h. Wykorzystujemy tu sugestie prof. Donalda Knutha. Po wyznaczeniu h rozpoczynamy pętlę warunkową nr 1. Pętla ta jest wykonywana dotąd, aż odstęp h przyjmie wartość 0. Wtedy kończymy algorytm, zbiór będzie posortowany.

17 Schemat blokowy cd. Wewnątrz pętli nr 1 umieszczony jest opisany wcześniej algorytm sortowania przez wstawianie, który dokonuje sortowania elementów poszczególnych podzbiorów wyznaczonych przez odstęp h. Po zakończeniu sortowania podzbiorów odstęp h jest zmniejszany i następuje powrót na początek pętli warunkowej nr 1. Pamiętajmy, każdy obieg pętli nr 2 sortuje przemiennie jeden element z kolejnych podzbiorów. Najpierw będą to elementy przedostatnie w kolejnych podzbiorach wyznaczonych odstępem h, później wcześniejsze i wcześniejsze. Takie podejście znacząco upraszcza algorytm sortowania.

18 Algorytm sortowania metodą Shella jest algorytmem niestabilnym, sortowanie odbywa się w miejscu.
Algorytm ten posiada klasę złożoności obliczeniowej w optymistycznym przypadku – dla zbiorów uporządkowanych (z niewielką liczbą elementów nie na swoich miejscach) O(n2) (O(n1,14)). Natomiast klasa złożoności obliczeniowej w typowym przypadku – dla zbiorów o losowym rozkładzie elementów oraz dla przypadku pesymistycznego – dla zbiorów posortowanych odwrotnie wynosi O(n1,15). Algorytm sortowania metodą Shella jest bezkonkurencyjny w klasie złożoności obliczeniowej O(n2) algorytmów sortujących przy sortowaniu zbiorów nieuporządkowanych i zbiorów posortowanych odwrotnie, czyli w przypadku ogólnym. Jednakże przy sortowaniu zbiorów w dużym stopniu uporządkowanych lepszym jest algorytm sortowania przez wstawianie.

19 Bibliografia Sysło M.: Algorytmy, WSiP, Warszawa 1997
Knuth Donald E.: Sztuka programowania. T. 1. Wydawnictwo Naukowo-Techniczne, 2002 Drozdek A.: Struktury danych w języku C, Helion, 2004 Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein: Wprowadzenie do algorytmów, Wydawnictwo Naukowo-Techniczne, wyd. VI 2004 pl.wikipedia.org/ algorytm.org/ encyklopedia.pwn.pl/


Pobierz ppt "Materiały pochodzą z Platformy Edukacyjnej Portalu"

Podobne prezentacje


Reklamy Google