Algorytmy sortujące i wyszukujące

Podobne dokumenty
Sortowanie przez wstawianie Insertion Sort

Programowanie w VB Proste algorytmy sortowania

Strategia "dziel i zwyciężaj"

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 )

Sortowanie danych. Jolanta Bachan. Podstawy programowania

Sortowanie. LABORKA Piotr Ciskowski

Wstęp do programowania

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

Laboratorium nr 7 Sortowanie

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

Analiza algorytmów zadania podstawowe

INFORMATYKA SORTOWANIE DANYCH.

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

Jeszcze o algorytmach

2. Tablice. Tablice jednowymiarowe - wektory. Algorytmy i Struktury Danych

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

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

lekcja 8a Gry komputerowe MasterMind

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

Metodyki i Techniki Programowania 2

PODSTAWY INFORMATYKI wykład 5.

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

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

Algorytm selekcji Hoare a. Łukasz Miemus

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

Algorytmy i Struktury Danych.

Tablice mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

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

Wybrane algorytmy tablicowe

Struktury Danych i Złożoność Obliczeniowa

Sortowanie. Bartman Jacek Algorytmy i struktury

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

Sortowanie - wybrane algorytmy

Uwaga: Funkcja zamień(a[j],a[j+s]) zamienia miejscami wartości A[j] oraz A[j+s].

Typy danych. 2. Dane liczbowe 2.1. Liczby całkowite ze znakiem i bez znaku: 32768, -165, ; 2.2. Liczby rzeczywiste stało i zmienno pozycyjne:

Jednym z najprostszych sposobów porządkowania jest technika stosowana przy sortowaniu listów:

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

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

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

Algorytmy przeszukiwania

Sortowanie Shella Shell Sort

Informatyka A. Algorytmy

Sortowanie bąbelkowe

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

PDF stworzony przez wersję demonstracyjną pdffactory Pro Program 15

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

Efektywna metoda sortowania sortowanie przez scalanie

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

Algorytmy sortowania w języku C. Autor: mgr inż. Sławomir Samolej. Zagadnienie 1. (Sortowanie)

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

EGZAMIN - Wersja A. ALGORYTMY I STRUKTURY DANYCH Lisek89 opracowanie kartki od Pani dr E. Koszelew

System Informatyczny Oddziału Wojewódzkiego NFZ

Algorytmy zrandomizowane

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

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

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

Algorytmy i Struktury Danych, 2. ćwiczenia

Inicjacja tablicy jednowymiarowej

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

Klasa 2 INFORMATYKA. dla szkół ponadgimnazjalnych zakres rozszerzony. Założone osiągnięcia ucznia wymagania edukacyjne na. poszczególne oceny

Algorytmy i struktury danych

Wykład 1_2 Algorytmy sortowania tablic Sortowanie bąbelkowe

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

MATERIAŁY - udostępnianie materiałów dydaktycznych w sieci SGH

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

Zajęcia nr 5 Algorytmy i wskaźniki. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Sortowanie w czasie liniowym

ALGORYTMY I STRUKTURY DANYCH

Zadanie 1. Potęgi (14 pkt)

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

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.

dodatkowe operacje dla kopca binarnego: typu min oraz typu max:

Wstęp do programowania

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

Wstęp do programowania

Programowanie Proceduralne

Instrukcje dla zawodników


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

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Analiza algorytmów zadania podstawowe

Algorytmy i struktury danych

I. Podstawy języka C powtórka

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima Uwagi przed sprawdzianem nr 1.

Sortowanie zewnętrzne

(3 kwiecień 2014) Marika Pankowska Kamila Pietrzak

Metoda bisekcji (inaczej połowienia przedziału lub równych podziałów)

Wstęp do programowania

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

Zaawansowane algorytmy i struktury danych

2 Arytmetyka. d r 2 r + d r 1 2 r 1...d d 0 2 0,

PODSTAWY INFORMATYKI wykład 10.

Podstawy i języki programowania

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

Szablony funkcji i klas (templates)

Zaawansowane algorytmy i struktury danych

System Informatyczny Oddziału Wojewódzkiego NFZ

Lab 9 Podstawy Programowania

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Transkrypt:

Algorytmy sortujące i wyszukujące Zadaniem algorytmów sortujących jest ułożenie elementów danego zbioru w ściśle określonej kolejności. Najczęściej wykorzystywany jest porządek numeryczny lub leksykograficzny. Posortowane elementy wykorzystywane są w bardziej zaawansowanych algorytmach na przykład wyszukujących. Przedstawione poniżej sposoby sortowania układają elementy w porządku rosnącym. Sortowanie przez wybieranie Sortowanie przez wybieranie polega na wybraniu z wektora elementu najmniejszego i zamianie go z elementem bieżącym. Załóżmy, że chcemy posortować n-elementowy wektor dane[] o indeksach od 0 do n-1. for (int i = 0; i < n-1; i++ ) { - przypisz zmiennej j indeks najmniejszego elementu spośród dane[i]...dane[n-1] - dokonaj zamiany elementów dane[i] z dane[j] Przykład, chcemy posortować następujący wektor dane[]. 4 2 5 3 1 Poniżej wszystkie kroki, które zostaną wykonane przy sortowaniu. Zmienna i to kolejny numer kroku, a j indeks najmniejszego elementu z zakresu od i do n-1 (n w naszym przykładzie wynosi 5). Sortowanie przez wstawianie i wektor wejściowy j wektor wyjściowy 0 4 2 5 3 1 4 1 2 5 3 4 1 1 2 5 3 4 1 1 2 5 3 4 2 1 2 5 3 4 3 1 2 3 5 4 3 1 2 3 5 4 4 W sortowaniu przez wstawianie wektor zostaje podzielony na dwie części, część posortowaną oraz część nieposortowaną. Istotą algorytmu jest pobieranie kolejnych elementów z części nieposortowanej i wstawianie ich na odpowiednie miejsce w części posortowanej (tak samo jak układanie kart w dłoni). Podział wektora ustalamy zakładając, że w części posortowanej znajduje się jego pierszy element, a cała reszta to część nieposortowana. Załóżmy, że chcemy posortować n-elementowy wektor dane[] o indeksach od 0 do n-1. 13

for (int i = 1; i < n; i++) { - pobierz pierwszy element z części nieposortowanej, e = dane[i] - wstaw ten element w odpowiedne miejsce w części posortowanej dane[0]...dane[i] Przykład, chcemy posortować następujący wektor dane[]. 4 2 5 3 1 Poniżej wszystkie kroki, które zostaną wykonane przy sortowaniu. Zmienna i to kolejny numer kroku, a e wartość pierwszego elementu z części nieposortowanej. Część posortowana zaznaczona jest kolorem niebieskim. i wektor wejściowy e = dane[i] wektor wyjściowy 1 4 2 5 3 1 2 2 4 5 3 1 2 2 4 5 3 1 5 2 4 5 3 1 3 2 4 5 3 1 3 2 3 4 5 1 4 2 3 4 5 1 1 Stosując algorytm sortowania przez wstawianie możemy sortować na bieżąco dane wejściowe (np. podczas pobierania ich od użytkownika z konsoli czy też odczytu z pliku). Sortowanie bąbelkowe Ten sposób sortowania polega na porównywaniu ze sobą par sąsiadujących elementów i zamianie ich kolejności jeśli nie spełniają warunku porządkowania. Załóżmy, że chcemy posortować n-elementowy wektor dane[] o indeksach od 0 do n-1. for (int i = 1; i < n; i++ ) { - przeglądaj kolejno pary elementów: (dane[n-1], dane[n-2]) (dane[n-2], dane[n-3])... (dane[i-1], dane[i]) - jeżeli elementy tworzące parę nie są prawidłowo uporządkowane, zamień je Przykład, chcemy posortować następujący wektor dane[]. 4 2 5 3 1 14

Poniżej poszczególne kroki, które zostaną wykonane przy sortowaniu. Zmienna i to kolejny numer kroku. Wektor brany pod uwagę jest uzależniony od wartości i od dane[n-1] do dane[i-1]. Elementy porównywane zaznaczone są kolorem niebieskim. i wektor wejściowy porównuję uzyskuję wektor wyjściowy 1 4 2 5 3 1 4 2 5 3 1 4 2 5 1 3 4 2 1 5 3 4 1 2 5 3 2 1 4 2 5 3 1 4 2 5 3 3 4 2 5 1 3 4 2 1 5 3 4 1 2 5 3 1 4 2 5 3 1 4 2 5 3 4 Sortowanie bąbelkowe jest mało wydajne dla większych zbiorów. Sortowanie szybkie Idea sortowania szybkiego (ang. quicksort) polega na podziale wektora na dwie części, jedna z nich zawiera elementy mniejsze od elementu dzielącego, druga większe. Każda z części jest znowu sortowana za pomocą algorytmu sortowania szybkiego (wywołania rekurencyjne). - wybierz jeden element w wektorze (oznaczmy go jako p) - dokonaj przemieszczenia elementów tak aby uzyskać elementy < p p elementy >= p - powtórz algorytm dla lewej (elementy mniejsze) i prawej (elementy większe) części wektora Element podziału może być pierwszym, ostatnim, środkowym czy też losowym elementem naszego wektora (często ma on wartość mediany). Przykład, chcemy posortować następujący wektor dane[]. Jako element dzielący wybieramy ostatni element wektora wejściowego. 3 4 1 7 2 8 5 6 Poniżej wszystkie kroki, które zostaną wykonane przy sortowaniu. W metodzie dokonującej przemieszczenia elementów wykorzystujemy dwa indeksy i, j umożliwiające nam wyszukiwanie elementów większych i mniejszych od elementu dzielącego (oznaczonego jako p). Początkowa wartość i to indeks pierwszego elementu wektora wejściowego, a j indeks przedostatniego elementu 15

wektora wejściowego. Na ostatnim indeksie wektora wejściowego mamy element dzielący (zauważ, że wektor wejściowy może być częścią wektora początkowego). Sama metoda realizująca podział może wyglądać następująco. i - indeks pierwszego elementu j - indeks przedostatniego elementu p - wartość ostatniego elementu (zapamiętujemy jego indeks w zmiennej k) // dopóki indeks i jest mniejszy od j while (i < j) { while (wektor[i] < p) i++; // szukamy od początku elementu mniejszego od p while (wektor[j] > p) j--; // szukamy od końca elementu większego od p jeśli nie minęliśmy się indeksami (i<j) to zamieniamy wektor[i] z wektor[j] zamieniamy miejscami elementy wektor[i] z wektor[k], dzięki temu element dzielący znajdzie się na właściwej pozycji zwracamy indeks i (czyli indeks podziału wektora na części) Przykład algorytmu przemieszczającego elementy w naszym wektorze dane[]. Element dzielący p został zaznaczony na niebiesko (jego indeks k wynosi 7). i j wektor wejściowy akcja wektor wyjściowy 0 6 3 4 1 7 2 8 5 6 3 6 3 4 1 7 2 8 5 6 zamień dane[i] z dane[j] 3 4 1 5 2 8 7 6 5 4 3 4 1 5 2 8 7 6 zamień dane[i] z dane[k] 3 4 1 5 2 6 7 8 Metoda zwróci nam indeks i czyli wartość 5. Ta informacja jest nam potrzebna do kolejnego wywołania algorytmu (dla lewej i prawej części wektora). Wszystkie wywołania zostały przedstawione poniżej. 3 4 1 5 2 6 7 8 1 2 3 5 4 7 8 1 3 4 5 7 3 5 6 7 8 16

Sortowanie szybkie jest przykładem algorytmu typu dziel i zwyciężaj. W skrócie zadanie jest dzielone na podzadania, które są przetwarzane na mniejszej ilości danych. Rozwiązania podzadań są składane w jedną całośći stanowią rozwiązanie dla zadania głównego. Wyszukiwanie wartości w wektorze Mając dany zbiór elementów zazwyczaj chcemy znaleźć konkretną wartość. Do przeszukiwania wektora stosuje się zazwyczaj wyszukiwanie sekwencyjne bądź też binarne. Wyszukiwanie sekwencyjne polega na sprawdzeniu kolejnych wartości (przeglądamy elementy od pierwszego do ostatniego indeksu). Wyszukiwanie binarne (ang. binary search) odbywa się na uporządkowanym ciągu elementów. Polega na połowieniu ciągu i ponownym szukaniu w tej połowie, w której może występować poszukiwana wartość (analogia do szukania danych w książce telefonicznej czy też w encyklopedii). Wyszukiwanie binarne najczęściej jest realizowane za pomocą rekurencji. Zadania do wykonania 1. Napisz program, który utworzy n-elementowy wektor, wygeneruje n pseudolosowych liczb całkowitych z przedziału [5, 67] (wartość n ma być określana w trakcie działania programu), uzupełni nimi wektor, a następnie dokona posortowania wektora oraz wyświetli jego zawartość pzed i po sortowaniu. Zastosuj algorytm sortowania przez wybieranie. Samo sortowanie ma się dokonywać za pomocą metody statycznej. Sortujemy w porządku rosnącym. 2. Dopisz do kodu zadania pierwszego metodę statyczną realizującą sortowanie za pomocą algorytmu sortowania przez wstawianie. 3. Dopisz do kodu zadania pierwszego metodę statyczną realizującą sortowanie za pomocą algorytmu sortowania bąbelkowego. 4. Dopisz do kodu zadania pierwszego metodę statyczną realizującą sortowanie za pomocą algorytmu sortowania szybkiego. 5. Napisz program, który pozwoli na wczytanie n ciągów znaków (wartość n ma być określana w trakcie działania programu), a następnie uporządkuje je alfabetycznie i w takiej postaci wyświetli na ekranie monitora. Przyjmij, że ciągi znaków składają się wyłącznie z liter alfabetu łacińskiego. W trakcie sortowania program nie powinien rozróżniać małych i dużych liter. Zastosuj algorytm sortowania przez wybieranie. Utwórz odpowiedni wektor oraz przypomnij sobie metody porównujące łańcuchy tekstowe (klasa String). 6. Napisz program pozwalający na wczytanie n liczb. Wprowadzane liczby mają być od razu umieszczane w wektorze w porządku rosnącym. Wyświetl utworzony wektor. 17

7. Napisz program pozwalający na wczytanie do wektora n wartości całkowitych i wyszukujący podaną przez użytkownika wartość. Zastosuj wyszukiwanie liniowe. 8. Napisz program pozwalający na wprowadzenie do wektora n wartości całkowitych. Każdą wprowadzaną liczbę należy umieścić w wektorze od razu w porządku rosnącym. Następnie program ma znaleźć wśród wartości znajdujących się w wektorze zadaną przez użytkownika liczbę. Zastosuj algorytm wyszukiwania binarnego Wykorzystaj rozwiązanie zadania nr 7. 18