Sortowanie Shella Shell Sort

Podobne dokumenty
Sortowanie przez wstawianie Insertion Sort

Sortowanie bąbelkowe - wersja nr 1 Bubble Sort

liniowa - elementy następują jeden za drugim. Graficznie możemy przedstawić to tak:

Algorytmy sortujące. Sortowanie bąbelkowe

Sortowanie. Bartman Jacek Algorytmy i struktury

wagi cyfry pozycje

Zadania do wykonania. Rozwiązując poniższe zadania użyj pętlę for.

Sortowanie. LABORKA Piotr Ciskowski

Zadanie projektowe 1: Struktury danych i złożoność obliczeniowa

Temat: Algorytmy zachłanne

Algorytmy sortujące. sortowanie kubełkowe, sortowanie grzebieniowe

Wstęp do programowania

Porównanie Heap Sort, Counting Sort, Shell Sort, Bubble Sort. Porównanie sortowao: HS, CS, Shs, BS

Algorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

Algorytmy sortujące i wyszukujące

ALGORYTMY. 1. Podstawowe definicje Schemat blokowy

Definicje. Algorytm to:

Luty 2001 Algorytmy (7) 2000/2001

Wykład z Technologii Informacyjnych. Piotr Mika

Iteracje. Algorytm z iteracją to taki, w którym trzeba wielokrotnie powtarzać instrukcję, aby warunek został spełniony.

Algorytmy i Struktury Danych, 2. ćwiczenia

Programowanie w VB Proste algorytmy sortowania

Strategia "dziel i zwyciężaj"

TEORETYCZNE PODSTAWY INFORMATYKI

Podstawy Programowania 1 Sortowanie tablic jednowymiarowych. Plan. Sortowanie. Sortowanie Rodzaje sortowania. Notatki. Notatki. Notatki.

Wprowadzenie do algorytmiki

Pętla for. Wynik działania programu:

Definicja. Ciąg wejściowy: Funkcja uporządkowująca: Sortowanie polega na: a 1, a 2,, a n-1, a n. f(a 1 ) f(a 2 ) f(a n )

Zapis algorytmów: schematy blokowe i pseudokod 1

Algorytmy i struktury danych

EGZAMIN MATURALNY Z INFORMATYKI. 10 maja 2017 POZIOM ROZSZERZONY. Godzina rozpoczęcia: 14:00 CZĘŚĆ I

ALGORYTMY Algorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny

Instrukcje sterujące. wer. 11 z drobnymi modyfikacjami! Wojciech Myszka :53:

znalezienia elementu w zbiorze, gdy w nim jest; dołączenia nowego elementu w odpowiednie miejsce, aby zbiór pozostał nadal uporządkowany.

2.8. Algorytmy, schematy, programy

Metodyki i Techniki Programowania 2

Programowanie proceduralne INP001210WL rok akademicki 2017/18 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

TEORETYCZNE PODSTAWY INFORMATYKI

Sortowanie danych. Jolanta Bachan. Podstawy programowania

Temat 8. Zrobić to szybciej Sieci sortujące

1. Informatyka - dyscyplina naukowa i techniczna zajmująca się przetwarzaniem informacji.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Wyszukiwanie. Wyszukiwanie binarne

Efektywna metoda sortowania sortowanie przez scalanie

Algorytmy i struktury danych. Wykład 4

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Wstęp do informatyki. Maszyna RAM. Schemat logiczny komputera. Maszyna RAM. RAM: szczegóły. Realizacja algorytmu przez komputer

Ćwiczenie 3 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Sortowanie - wybrane algorytmy

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Algorytmy i struktury danych Laboratorium Nr 4

. Podstawy Programowania 1. Sortowanie tablic jednowymiarowych. Arkadiusz Chrobot. 16 listopada 2016

Informatyka wprowadzenie do algorytmów (II) dr hab. inż. Mikołaj Morzy

Część I. Uwaga: Akceptowane są wszystkie odpowiedzi merytorycznie poprawne i spełniające warunki zadania. Zadanie 1.1. (0 3)

Analiza algorytmów zadania podstawowe

Algorytmy przeszukiwania wzorca

INFORMATYKA W SZKOLE. Podyplomowe Studia Pedagogiczne. Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227

Laboratorium nr 7 Sortowanie

Sortowanie zewnętrzne

Algorytm. a programowanie -

Informatyka I. Wykład 3. Sterowanie wykonaniem programu. Instrukcje warunkowe Instrukcje pętli. Dr inż. Andrzej Czerepicki

Teoretyczne podstawy informatyki

TEORETYCZNE PODSTAWY INFORMATYKI

Podstawy programowania. Wykład: 4. Instrukcje sterujące, operatory. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

INFORMATYKA W SZKOLE. Podyplomowe Studia Pedagogiczne. Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227

KONSPEKT ZAJĘĆ KOŁA INFORMATYCZNEGO LUB MATEMATYCZNEGO W KLASIE III GIMNAZJUM LUB I LICEUM ( 2 GODZ.)

EGZAMIN MATURALNY W ROKU SZKOLNYM 2017/2018 INFORMATYKA

Struktury Danych i Złożoność Obliczeniowa

INFORMATYKA SORTOWANIE DANYCH.

Technologie cyfrowe. Artur Kalinowski. Zakład Cząstek i Oddziaływań Fundamentalnych Pasteura 5, pokój 4.15

Temat 7. Najlżejsze i najcięższe algorytmy sortowania

1 Wprowadzenie do algorytmiki

Algorytm selekcji Hoare a. Łukasz Miemus

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 9 Rekurencja

Sortowanie przez wstawianie

MODELOWANIE RZECZYWISTOŚCI

Algorytm. Krótka historia algorytmów

EGZAMIN MATURALNY W ROKU SZKOLNYM 2017/2018 INFORMATYKA

Poprawność semantyczna

PRÓBNY EGZAMIN MATURALNY Z INFORMATYKI

PODSTAWY INFORMATYKI 1 PRACOWNIA NR 6

WHILE (wyrażenie) instrukcja;

Technologie Informacyjne Mechatronika 2012/2013 Algorytmy. Podstawy programowania

Podstawy programowania Laboratorium. Ćwiczenie 2 Programowanie strukturalne podstawowe rodzaje instrukcji

Schematy blokowe I. 1. Dostępne bloki: 2. Prosty program drukujący tekst.

Instrukcje sterujące

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 9. Karol Tarnowski A-1 p.

Rozdział 2 PROGRAMOWANIE LINIOWE CAŁKOWITOLICZBOWE

Programowanie w języku C++ Agnieszka Nowak Brzezińska Laboratorium nr 2

PODSTAWY INFORMATYKI wykład 10.

Technologia informacyjna Algorytm Janusz Uriasz

Algorytmy. 1. Sortowanie 2. Statki i okręty. programowanie cz.7. poniedziałek, 2 marca 2009

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Instrukcje cykliczne (pętle) WHILE...END WHILE

EGZAMIN MATURALNY 2012 INFORMATYKA

Każde wykonanie bloku instrukcji nazywamy pojedynczym przebiegiem lub iteracją pętli.

Zadanie 1. Zmiana systemów. Zadanie 2. Szyfr Cezara. Zadanie 3. Czy liczba jest doskonała. Zadanie 4. Rozkład liczby na czynniki pierwsze Zadanie 5.

EGZAMIN MATURALNY Z INFORMATYKI 11 MAJA 2018 POZIOM ROZSZERZONY. Godzina rozpoczęcia: 14:00 CZĘŚĆ I WYBRANE: Czas pracy: 90 minut

INFORMATYKA W SZKOLE. Podyplomowe Studia Pedagogiczne. Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227

Transkrypt:

Sortowanie Shella Shell Sort W latach 50-tych ubiegłego wieku informatyk Donald Shell zauważył, iż algorytm sortowania przez wstawianie pracuje bardzo efektywnie w przypadku gdy zbiór jest w dużym stopniu uporządkowany (sprawdź wyniki naszych badań czasów sortowania dla tego algorytmu). Z kolei algorytm ten pracuje nieefektywnie w zbiorach 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 dzielimy na podzbiory, których elementy są odległe od siebie w sortowanym zbiorze o pewien odstęp h. Każdy z tych podzbiorów sortujemy algorytmem przez wstawianie. Następnie odstęp zmniejszamy. Powoduje to powstanie nowych podzbiorów (będzie ich już mniej). Sortowanie powtarzamy i znów zmniejszamy odstęp, aż osiągnie on wartość 1. Wtedy sortujemy już normalnie za pomocą 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(n 2 ). 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).

Posortujemy metodą Shella zbiór ośmiu liczb: { 4 2 9 5 6 3 8 1 } w porządku rosnącym. Zbiór posiada osiem elementów, zatem 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 te są dwuelementowe, to sortowanie pę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 4 2 9 5 6 3 8 1 - Zbiór wejściowy 1 4 6 4 6 4 6 2 2 3 2 3 2 3 3 9 8 8 9 8 9 4 5 1 1 5 1 5 Zbiór wyjściowy - 4 2 8 1 6 3 9 5 Zmniejszamy odstęp h o połowę, więc h = 2. Zbiór podstawowy zostanie podzielony na dwa podzbiory. żdy z tych podzbiorów sortujemy przez wstawianie: Podział, h=2 Sortowanie Wynik 4 2 8 1 6 3 9 5 - Zbiór wejściowy 1 4 8 6 9 4 6 8 9 4 6 8 9 2 2 1 3 5 1 2 3 5 1 2 3 5 Zbiór wyjściowy - 4 1 6 2 8 3 9 5 Zmniejszamy 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. Jednak 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 końca. Podział, h=1 Sortowanie Wynik 4 1 6 2 8 3 9 5 - Zbiór wejściowy 1 4 1 6 2 8 3 9 5 1 2 3 4 5 6 8 9 1 2 3 4 5 6 8 9 Zbiór wyjściowy - 1 2 3 4 5 6 8 9

Dobór optymalnych odstępów prof. Donald Knuth Kluczowym elementem wpływającym na efektywność sortowania metodą Shella jest właściwy dobór ciągu odstępów. Okazuje się, iż ciąg zaproponowany przez twórcę algorytmu jest jednym z najgorszych, ponieważ w kolejnych podzbiorach uczestniczą wielokrotnie te same elementy (możesz to prosto sprawdzić w podanym powyżej przykładzie). Dotąd problem optymalnych odstępów w algorytmie sortowania metodą Shella nie został rozwiązany matematycznie, ponieważ w ogólnym przypadku jest niezwykle trudny. Wielu badaczy proponowało na wybór tych odstępów różne ciągi liczbowe otrzymując lepsze lub gorsze rezultaty. Na przykład profesor Donald Knuth (autor "Sztuki Programowania Komputerów" - "The Art of Computer Programming") zbadał 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 h 1 = 1 obliczamy h s = 3h s-1 + 1 aż do momentu gdy h s Ostatecznie h = [h s : 9] n Obliczmy pierwszy odstęp dla zbioru o n = 200 elementach: h 1 = 1 h 2 = 3h 1 + 1 = 3 + 1 = 4 - mniejsze od 200, kontynuujemy h 3 = 3h 2 + 1 = 12 + 1 = 13 - kontynuujemy h 4 = 3h 3 + 1 = 39 + 1 = 40 - kontynuujemy h 5 = 3h 4 + 1 = 120 + 1 = 121 - kontynuujemy h 6 = 3h 5 + 1 = 363 + 1 = 364 - stop, ponieważ jest większe od 200 h = [h 6 : 9] = [364 : 9] = [40 4 / 9 ] = 40 (zwróć uwagę, iż jest to zawsze element wcześniejszy o dwie pozycje, czyli h 4 )

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 naszym algorytmi 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 j h x - indeks elementu listy uporządkowanej, i Î N - zmienna sterująca pętli, j Î N - odstęp pomiędzy kolejnymi elementami podzbiorów, h Î N - zawiera wybrany ze zbioru element 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 kroki K06...K10 K06: Dla j = n - h, n - h - 1,..., 1: wykonuj kroki 7...9 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 algorytm

Schemat blokowy Algorytm sortowania metodą Shella jest ulepszonym algorytmem sortowania przez wstawianie. Aby się o tym przekonać, wystarczy spojrzeć na schemat blokowy. Kolorem szarym zaznaczyliśmy na nim 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. 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. Uwaga techniczna: Zwróć uwagę, iż 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.