Programowanie w VB Proste algorytmy sortowania



Podobne dokumenty
Sortowanie danych. Jolanta Bachan. Podstawy programowania

Analiza algorytmów zadania podstawowe

Laboratorium nr 7 Sortowanie

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

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Algorytmy sortujące i wyszukujące

Algorytmy i Struktury Danych, 2. ćwiczenia

Algorytmy przeszukiwania

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 )

Strategia "dziel i zwyciężaj"

Podstawowe algorytmy i ich implementacje w C. Wykład 9

Wstęp do programowania

INFORMATYKA SORTOWANIE DANYCH.

Sortowanie. LABORKA Piotr Ciskowski

Informatyka A. Algorytmy

prowadzący dr ADRIAN HORZYK /~horzyk tel.: Konsultacje paw. D-13/325

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

Sortowanie - wybrane algorytmy

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

Algorytm selekcji Hoare a. Łukasz Miemus

Jeszcze o algorytmach

Instrukcje pętli przykłady. Odgadywanie hasła. 1) Program pyta o hasło i podaje adres, gdy hasło poprawne lub komunikat o błędnym haśle.

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

Sortowanie przez scalanie

Analiza algorytmów zadania podstawowe

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

Sortowanie przez wstawianie Insertion Sort

Algorytmy i Struktury Danych.

Podstawy algorytmiki i programowania - wykład 6 Sortowanie- algorytmy

Złożoność obliczeniowa algorytmu ilość zasobów komputera jakiej potrzebuje dany algorytm. Pojęcie to

WYKŁAD 9. Algorytmy sortowania elementów zbioru (tablic) Programy: c4_1.c... c4_3.c. Tomasz Zieliński

Struktury Danych i Złożoność Obliczeniowa

Sortowanie bąbelkowe

Rekurencja. Dla rozwiązania danego problemu, algorytm wywołuje sam siebie przy rozwiązywaniu podobnych podproblemów. Przykład: silnia: n! = n(n-1)!

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

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

Algorytmy i Struktury Danych.

Wykład 3. Metoda dziel i zwyciężaj

Algorytmy i struktury danych

PoniŜej znajdują się pytania z egzaminów zawodowych teoretycznych. Jest to materiał poglądowy.

Wstęp do programowania. Dziel i rządź. Piotr Chrząstowski-Wachtel

Zaawansowane algorytmy i struktury danych

Wydział Zarządzania AGH. Katedra Informatyki Stosowanej. Pętle. Programowanie komputerowe

Sortowanie. Kolejki priorytetowe i algorytm Heapsort Dynamiczny problem sortowania:

Wykład 4. Sortowanie

Wstęp do programowania

Algorytmy i Struktury Danych. (c) Marcin Sydow. Sortowanie Selection Sort Insertion Sort Merge Sort. Sortowanie 1. Listy dowiązaniowe.

Zaawansowane algorytmy i struktury danych

REKURENCJA W JĘZYKU HASKELL. Autor: Walczak Michał

operacje porównania, a jeśli jest to konieczne ze względu na złe uporządkowanie porównywanych liczb zmieniamy ich kolejność, czyli przestawiamy je.

Wykład 2. Poprawność algorytmów

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Struktury danych i złożoność obliczeniowa Wykład 2. Prof. dr hab. inż. Jan Magott

Podstawy Informatyki. Sprawność algorytmów

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

Programowanie dynamiczne

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

TEORETYCZNE PODSTAWY INFORMATYKI

Teoretyczne podstawy informatyki

ALGORYTMY I STRUKTURY DANYCH

Programowanie Proceduralne

2:8,7 3:9,4 / \ / \ / \ / \ 4:7,3 5:8 6:9,2 7:4

Algorytmy i struktury danych. Co dziś? Tytułem przypomnienia metoda dziel i zwyciężaj. Wykład VIII Elementarne techniki algorytmiczne

Złożoność algorytmów. Wstęp do Informatyki

Algorytmy i złożoność obliczeniowa. Wojciech Horzelski

PODSTAWY INFORMATYKI wykład 5.

Wykład 5: Iteracja, indukcja i rekurencja Sortowanie

Programowanie od pierwszoklasisty do maturzysty. Grażyna Koba

Algorytmy i Struktury Danych, 2. ćwiczenia

funkcje rekurencyjne Wykład 12. Podstawy programowania (język C) Funkcje rekurencyjne (1) Funkcje rekurencyjne (2)

Źródła. N.Wirth Algorithms and Data Structures, 1985 D.E.Knuth The Art of Computer Programming. Vol. 3, 1973

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Kolejka priorytetowa. Często rozważa się kolejki priorytetowe, w których poszukuje się elementu minimalnego zamiast maksymalnego.

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

Sortowanie bąbelkowe - wersja nr 1 Bubble Sort

Przykładowe B+ drzewo

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

Podstawy programowania w języku Visual Basic dla Aplikacji (VBA)

Algorytmy i struktury danych Sortowanie IS/IO, WIMiIP

Algorytmy i struktury danych

Rekurencja. Rekurencja zwana także rekursją jest jedną z najważniejszych metod konstruowania rozwiązań i algorytmów.

Sortowanie zewnętrzne

[12] Metody projektowania algorytmów (dziel i rządź, programowanie dynamiczne i algorytmy zachłanne).

Efektywna metoda sortowania sortowanie przez scalanie

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

Wybrane algorytmy tablicowe

Algorytmy sortujące. Sortowanie bąbelkowe

Technologie informacyjne Wykład VII-IX

Algorytmika i pseudoprogramowanie

PRÓBNY EGZAMIN MATURALNY Z INFORMATYKI

CO TO JEST ALGORYTM?

Podstawy programowania 2. Temat: Drzewa binarne. Przygotował: mgr inż. Tomasz Michno

Sortowanie w czasie liniowym

Zestaw A-1: Organizacja plików: Oddajemy tylko źródła programów (pliki o rozszerzeniach.adb i.ads)!!! Zad. 1: 4,3,3 2,2,1 Zad. 2: 3,3,3 Zad.

Sortowanie Shella Shell Sort

Rekurencje. Jeśli algorytm zawiera wywołanie samego siebie, jego czas działania moŝe być określony rekurencją. Przykład: sortowanie przez scalanie:

KOPCE KOLEJKI PRIORYTETOWE - PRZYPOMNIENIE KOPCE WYSOKOŚĆ KOPCA KOPCE I KOLEJKI PRIORYTETOWE PROJEKTOWANIE ALGORYTMÓW I METODY SZTUCZNEJ INTELIGENCJI

Wstęp do programowania

1 Wprowadzenie do algorytmiki

Informatyka 1. Złożoność obliczeniowa

Transkrypt:

Programowanie w VB Proste algorytmy sortowania Sortowanie bąbelkowe Algorytm sortowania bąbelkowego polega na porównywaniu par elementów leżących obok siebie i, jeśli jest to potrzebne, zmienianiu ich kolejności. Czyli w pierwszym przebiegu porównujemy (i ewentualnie zamieniamy): Element pierwszy i drugi Element drugi i trzeci... Element (n-1)-wszy i n-ty Każdy element jest tak długo przesuwany w ciągu, aż napotkany zostanie element większy od niego, wtedy w następnych krokach przesuwany jest ten większy element. Po pierwszym przebiegu ciąg nie musi być jeszcze uporządkowany, ale na pozycji n znajdzie się maksymalny element ciągu. Zatem w drugim przebiegu można porządkować ciąg krótszy, czyli tylko elementy na pozycjach od 1 do n-1. Po drugim przebiegu, dwa ostatnie elementy są na swoich miejscach, czyli pozostaje posortować ciąg o dwa elementy krótszy, itd. Można jeszcze bardziej usprawnić ten algorytm. Jeżeli w pewnym przebiegu algorytmu ostatnia zamiana nastąpiła na pozycji i, to w następnym przebiegu wystarczy porządkować tylko elementy na pozycjach od 1 do i-1. W takiej wersji ten algorytm jest zrealizowany w demonstracji. Jeżeli dane wejściowe są uporządkowane, to algorytm wykonuje tylko jeden przebieg (nie jest wykonywana żadna zamiana). Sub SortBubble() Dim i As Integer, j As Integer, v As Integer For i = 1 To N For j = 1 To N - i If a(j) > a(j + 1) Then v = a(j) a(j) = a(j + 1) a(j + 1) = v Sortowanie przez wstawianie W algorytmie sortowania przez wstawianie ciąg danych jest dzielony na dwie części: już uporządkowaną (przed uruchomieniem procedury nie zawiera ona żadnych elementów), jeszcze nie uporządkowaną (na początku zawiera wszystkie elementy). Sposób porządkowania można opisać następująco:

1. weź pierwszy element z części nieuporządkowanej (jeśli jest pusta to zakończ działanie algorytmu), 2. wstaw go w odpowiednie miejsce w części uporządkowanej (po takiej operacji część nieuporządkowana jest jeden element krótsza, a część posortowana zyskuje jeden element). Pozostaje jeszcze do rozstrzygnięcia, w jaki sposób wyznaczyć prawidłowe położenie nowego elementu w części uporządkowanej. Najprostszy sposób polega na porównaniu tego elementu z kolejnymi elementami części uporządkowanej. Jeżeli element na pozycji i jest większy od wstawianego, to ten nowy element należy wstawić między elementy na pozycjach i-1 i i. Inna strategia wstawiania elementu do uporządkowanego ciągu jest zastosowana w sortowaniu przez wstawianie z binarnym umieszczaniem. Algorytm ten działa w czasie pesymistycznym 1/2 N^2 - O(N), oczekiwanym 1/4 N^2 + O(N). Ilość wykonanych porównań jest równa liczbie inwersji, tzn. takich par że a[i] > a[j] dla i < j, zatem działa bardzo szybko dla tablic niemal uporządkowanych. Algorytm ten jest stabilny, prosty i łatwo implementowalny. ' Znajdowanie indeksu dla nowej wartosci v w tablicy ' algorytm iteracyjny Function SearchIdxIter(ByVal l As Integer, ByVal p As For k = l To p If a(k) >= v Then Exit For Next k SearchIdxIter = k ' Znajdowanie indeksu dla nowej wartosci v w tablicy ' iteracyjny algorytm przeszukiwania binarnego Function SearchIdxBinIter(ByVal l As Integer, ByVal p As While p - l >= 0 If a(l) >= v Then SearchIdxBinIter = l If a(p) < v Then SearchIdxBinIter = p + 1 k = (l + p) \ 2 If a(k) < v Then l = k + 1 Else p = k Sub SortInsertBinIter() k = SearchIdxBinIter(1, i - 1, v) Sub SortInsertBinRek() k = SearchIdxBinRek(1, i - 1, v) Sub SortInsertIter() k = SearchIdxIter(1, i - 1, v)

' Znajdowanie indeksu dla nowej wartosci v w tablicy ' rekurencyjny algorytm przeszukiwania binarnego Function SearchIdxBinRek(ByVal l As Integer, ByVal p As If a(l) >= v Then SearchIdxBinRek = l If a(p) < v Then SearchIdxBinRek = p + 1 If p <= l + 1 Then SearchIdxBinRek = p k = (l + p) \ 2 If a(k) < v Then SearchIdxBinRek = SearchIdxBinRek(k, p, v) Else SearchIdxBinRek = SearchIdxBinRek(l, k, v) Sortowanie przez selekcję Jest to chyba najbardziej intuicyjny algorytm sortowania. Polega on na wielokrotnym wyborze minimalnego elementu z coraz krótszego podciągu danych. Dokładnie ma to następujący przebieg: Wybierz minimum z ciągu elementów na pozycjach od 1 do n i zamień go z pierwszym elementem. Wybierz minimum z ciągu elementów na pozycjach od 2 do n i zamień go z drugim elementem (po tym kroku elementy na pozycjach od 1 do 2 są uporządkowane).... Wybierz minimum z ciągu elementów na pozycjach n-1 i n i zamień go z elementem na pozycji n-1 (po tej operacji elementy na pozycjach od 1 do n-1 są uporządkowane, a element na pozycji n jest maksymalny, czyli ciąg elementów na pozycjach od 1 do n jest uporządkowany) Znalezienie minimum w ciągu wymaga m-1 porównań, gdzie m jest długością ciągu. Algorytm sortowania przez wybór wykonuje n-1 takich operacji, a długość ciągu, z którego wybierany jest element minimalny zmienia się od n do 2. ' Znajdowanie indeksu najmniejszego elementu w tablicy nieposortowanej Function SearchIdxMin(ByVal l As Integer, ByVal p As Integer) As Integer Dim Min As Integer, k As Integer SearchIdxMin = l Min = a(l) For k = l + 1 To p If a(k) < Min Then SearchIdxMin = k

Min = a(k) Next k Sub SortSelection() Dim i As Integer, v As Integer For i = 1 To N - 1 k = SearchIdxMin(i, N) a(i) = a(k) Algorytm ten działa w czasie stałym 1/2 N^2 - O(N); zawsze wykonujemy ten sam ciąg porównań. Algorytm ten dokonuje tylko N-1 przestawień. Algorytm ten nie jest stabilny. Sortowanie szybkie W przypadku tej metody sortowania jest wykorzystywana strategia "dziel i zwyciężaj". Jest to bardzo efektywna technika algorytmiczna (wykorzystana jest także w algorytmie sortowania przez scalanie). Przypuśćmy, że potrafimy podzielić dany ciąg na dwie takie części, że elementy pierwszego ciągu są mniejsze od elementów drugiego ciągu, czyli nieformalnie mówiąc, na elementy "małe" i "duże". Mając taki podział ciągu, możemy każdą z części uporządkować osobno (pomińmy na razie, w jaki sposób to zrobić). Otrzymamy ciąg składający się z uporządkowanych elementów "małych", a po nich następują uporządkowane elementy "duże" - czyli cały ciąg jest już uporządkowany! Algorytm służący do dzielenia ciągu na dwie części, spełniające opisany warunek, ma następującą postać: Weź pierwszy element ciągu (oznaczmy go przez x). Podziel ciąg tak, aby w pierwszej części znalazły się elementy mniejsze lub równe x, a w drugiej większe lub równe x Można teraz podać pełny algorytm sortujący: Jeżeli liczba elementów w ciągu jest większa od 1, to podziel ciąg na dwie części tak, aby elementy z pierwszej części były nie większe niż elementy z drugiej części. Wywołaj procedurę sortującą dla pierwszej części ciągu. Wywołaj procedurę sortującą dla drugiej części ciągu. Dla poprawności działania powyższego algorytmu nie ma znaczenia, który element zostanie wybrany jako element rozdzielający ciąg na dwie części. Ma to jednak wpływ na efektywność algorytmu. W naszym przypadku wybierany jest element środkowy. Czas działania tego algorytmu sortowania zależy od wielkości podziałów wykonywanych przez procedurę dzielącą ciąg. Jeżeli podziały te są zrównoważone, czyli wielkości powstających części są sobie równe, to algorytm ten jest praktycznie najszybszą metodą sortowania stąd jego nazwa: sortowanie szybkie (ang. quicksort). Jeżeli natomiast otrzymane w wyniku podziału ciągi mają bardzo różne długości, to złożoność algorytmu jest większa. Sub QuickSort(ByVal l As Integer, ByVal p As Integer) Dim v As Integer, i As Integer, j As Integer, temp As Integer

v = a((l + p) \ 2) i = l j = p Do While a(i) < v i = i + 1 While v < a(j) j = j - 1 If i <= j Then temp = a(i) a(i) = a(j) a(j) = temp i = i + 1 j = j - 1 Loop While i <= j If l < j Then QuickSort l, j If i < p Then QuickSort i, p