Programowanie proceduralne INP001210WL rok akademicki 2017/18 semestr letni Wykład 3 Karol Tarnowski karol.tarnowski@pwr.edu.pl A-1 p. 411B
Plan prezentacji (1) Co to jest algorytm? Zapis algorytmów Algorytmy sortowania: Sortowanie przez wybór (selectsort) Sortowanie bąbelkowe (bubblesort) Sortowanie przez scalanie (mergesort) Sortowanie szybkie (quicksort) M. M. Sysło, Algorytmy, WSiP, 2002
Plan prezentacji (2) Podział kodu źródłowego
Co to jest algorytm? Algorytm jest przepisem opisującym krok po kroku rozwiązanie problemu lub osiągnięcie jakiegoś celu Algorytmika to dziedzina zajmująca się algorytmami i ich właściwościami
Algorytm Słowo algorytm wywodzi się od nazwiska arabskiego matematyka i astronoma. Muhammad ibn Musa al- Chuwarizmi żył na przełomie VIII i IX wieku, jest uznawany za prekursora metod obliczeniowych w matematyce https://pl.wikipedia.org/wiki/ Muhammad_ibn_Musa_al- Chuwarizmi
Przykład algorytmu https://www.kwestiasmaku.com/przepis/kakaowe-ciasto-bez-pieczenia
Przykład algorytmu https://www.kwestiasmaku.com/przepis/kakaowe-ciasto-bez-pieczenia
Przykład algorytmu https://www.kwestiasmaku.com/przepis/kakaowe-ciasto-bez-pieczenia
Algorytm Euklidesa Algorytm wyznaczania największego wspólnego dzielnika dwóch dodatnich liczb całkowitych został sformułowany w IV w. p.n.e. przez Euklidesa
Co to jest program? Program to lista szczegółowych instrukcji przekazywanych komputerowi do realizacji określonych zadań
Program i przepis a algorytm Gotowanie Informatyka Składniki Dane Przepis Program Kucharz i kuchnia Komputer Danie Wynik
Zapis algorytmów Algorytm może być zapisywany na różne sposoby: językiem naturalnym, pseudokodem, schematem blokowym, językiem programowania
Znajdowanie elementu maksymalnego w tablicy Dane wejściowe: n-elementowa tablica liczb Dane wyjściowe: wartość największej liczby w tablicy
Znajdowanie elementu maksymalnego w tablicy Przypisz maksimum wartość początkowego elementu tablicy Dla kolejnych elementów tablicy: Jeśli dany element jest większy od maksimum Przypisz maksimum wartość danego elementu
Znajdowanie elementu maksymalnego w tablicy 1. Przypisz maksimum wartość początkowego elementu tablicy. 2. Przypisz zmiennej indeks wartość 1. 3. Jeśli indeks jest większy/równy n idź do 6. 4. Jeśli element wskazywany przez indeks jest większy od maksimum, to przypisz maksimum wartość elementu wskazywanego przez indeks 5. Zwiększ indeks o 1 i idź do 3. 6. Koniec (element największy jest w zmiennej maksimum).
Znajdowanie elementu maksymalnego w tablicy start dane: tablica t i jej rozmiar n m = t[0] i = 1 TAK jeśli i < n NIE TAK jeśli t[i] > m NIE m = t[i] i = i + 1 koniec
Znajdowanie elementu maksymalnego w tablicy float max(float t[], int n){ float m = t[0]; int i; for( i=1; i<n; i++){ if( t[i] > m ) m = t[i]; } return m; }
Znajdowanie pozycji elementu maksymalnego w tablicy Przypisz maksimum_indeks wartość 0 Dla kolejnych elementów tablicy: Jeśli dany element jest większy od wskazywanego przez maksimum_indeks Przypisz maksimum_indeks wartość indeksu danego elementu
Sortowanie bąbelkowe Jeżeli ciąg nie jest uporządkowany, to istnieją dwa sąsiednie elementy, które są w złej kolejności
Sortowanie bąbelkowe 3 5 1 2 8 4 7 6 3 1 5 2 8 4 7 6 3 1 2 5 8 4 7 6 3 1 2 5 4 8 7 6 3 1 2 5 4 7 8 6 3 1 2 5 4 7 6 8
Sortowanie bąbelkowe 3 1 2 5 4 7 6 8 1 3 2 5 4 7 6 8 1 2 3 5 4 7 6 8 1 2 3 4 5 7 6 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
Sortowanie bąbelkowe Wykonaj n-1 przebiegów przez tablicę Wykonaj n-i porównań sąsiednich elementów (gdzie i to numer iteracji) Jeśli elementy są nie po kolei to zamień je miejscami
Sortowanie przez wybór Wyszukujemy pozycję najmniejszego elementu i przestawiamy go na właściwą pozycję Następnie kontynuujemy dla pozostałej części tablicy
Sortowanie przez wybór 3 5 1 2 8 4 7 6 1 5 3 2 8 4 7 6 1 2 3 5 8 4 7 6 1 2 3 5 8 4 7 6 1 2 3 4 8 5 7 6 1 2 3 4 5 8 7 6
Sortowanie przez wybór 1 2 3 4 5 8 7 6 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8
Sortowanie przez scalanie Podziel tablicę na dwie równe części Zastosuj sortowanie przez scalanie do każdej z nich oddzielnie Połącz posortowane podciągi w jeden ciąg posortowany
Sortowanie przez scalanie Scalanie Procedura scalania dwóch ciągów a[0..n-1] i b[0..m-1] do ciągu c[0..n+m-1] 1. Ustaw indeksy na początek ciągów: i=0, j=0 2. Jeśli w ciągu a nie pozostało już nic do przetworzenia (i>=n), to dołącz pozostałe elementy z b co c i zakończ 3. Jeśli w ciągu b nie pozostało już nic do przetworzenia (j>=m), to dołącz pozostałe elementy z a co c i zakończ 4. Jeśli a[i] <= b[j] to dołącz a[i] do c i zwiększ i o 1, w p.p. dołącz b[j] do c i zwiększ j o 1. 5. Powtarzaj od 2.
Sortowanie przez scalanie 4 5 7 8 1 2 3 6
Sortowanie przez scalanie 4 5 7 8 1 2 3 6 1
Sortowanie przez scalanie 4 5 7 8 1 2 3 6 1
Sortowanie przez scalanie 4 5 7 8 1 2 3 6 1 2
Sortowanie przez scalanie 4 5 7 8 1 2 3 6 1 2 3
Sortowanie przez scalanie 4 5 7 8 1 2 3 6 1 2 3 4
Sortowanie przez scalanie 4 5 7 8 1 2 3 6 1 2 3 4 5
Sortowanie przez scalanie 4 5 7 8 1 2 3 6 1 2 3 4 5 6
Algorytmy sortowania Sortowanie przez scalanie 4 5 7 8 1 2 3 6 1 2 3 4 5 6 7 8
Sortowanie przez scalanie Scalanie Procedura scalania dwóch ciągów a[0..n-1] i b[0..m-1] do ciągu c[0..n+m-1] 1. Ustaw indeksy na początek ciągów: i=0, j=0 2. Jeśli w ciągu a nie pozostało już nic do przetworzenia (i>=n), to dołącz pozostałe elementy z b co c i zakończ 3. Jeśli w ciągu b nie pozostało już nic do przetworzenia (j>=m), to dołącz pozostałe elementy z a co c i zakończ 4. Jeśli a[i] <= b[j] to dołącz a[i] do c i zwiększ i o 1, w p.p. dołącz b[j] do c i zwiększ j o 1. 5. Powtarzaj od 2.
Sortowanie szybkie Podziel tablicę na dwie części: mniejsze i większe od wybranego elementu Zastosuj sortowanie szybkie do każdej z nich oddzielnie Połącz posortowane podciągi w jeden ciąg posortowany
Algorytmy sortowania Sortowanie szybkie 2 7 8 4 6 1 3 5 2 7 8 4 6 1 3 5
Algorytmy sortowania Sortowanie szybkie 2 7 8 4 6 1 3 5 2 7 8 4 6 1 3 5
Algorytmy sortowania Sortowanie szybkie 2 7 8 4 6 1 3 5 2 7 8 4 6 1 3 5
Algorytmy sortowania Sortowanie szybkie 2 7 8 4 6 1 3 5 2 7 8 4 6 1 3 5
Algorytmy sortowania Sortowanie szybkie 2 7 8 4 6 1 3 5 2 4 8 7 6 1 3 5
Algorytmy sortowania Sortowanie szybkie 2 7 8 4 6 1 3 5 2 4 8 7 6 1 3 5
Algorytmy sortowania Sortowanie szybkie 2 7 8 4 6 1 3 5 2 4 8 7 6 1 3 5
Algorytmy sortowania Sortowanie szybkie 2 7 8 4 6 1 3 5 2 4 1 7 6 8 3 5
Algorytmy sortowania Sortowanie szybkie 2 7 8 4 6 1 3 5 2 4 1 7 6 8 3 5
Algorytmy sortowania Sortowanie szybkie 2 7 8 4 6 1 3 5 2 4 1 3 6 8 7 5
Algorytmy sortowania Sortowanie szybkie 2 7 8 4 6 1 3 5 2 4 1 3 6 8 7 5
Algorytmy sortowania Sortowanie szybkie 2 7 8 4 6 1 3 5 2 4 1 3 5 8 7 6
Algorytmy sortowania Sortowanie szybkie 2 7 8 4 6 1 3 5 2 4 1 3 5 8 7 6 1 2 3 4 5 8 7 6 1 2 3 4 5 8 7 6 1 2 3 4 5 8 7 6 1 2 3 4 5 6 7 8
Pliki nagłówkowe W złożonych programach istnieje konieczność rozdzielenia kodu źródłowego na kilka plików
Pliki nagłówkowe deklaracje funkcji funkcja główna kod źródłowy funkcji
Pliki nagłówkowe main.c
Pliki nagłówkowe sort.h
Pliki nagłówkowe max.c
Absolutne minimum Przed napisaniem programu przeanalizuj działanie algorytmu Złożony program rozdziel na kilka plików źródłowych