Programowanie proceduralne
INP001210WL
rok akademicki 2018/19 semestr letni
Wykład 3
Karol Tarnowski
karol.tarnowski@pwr.edu.pl A-1 p. 411B
• 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)
Plan prezentacji (1)
M. M. Sysło, Algorytmy, WSiP, 2002
• Podział kodu źródłowego
Plan prezentacji (2)
• 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
Co to jest 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
Algorytm
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 wyznaczania największego
wspólnego dzielnika dwóch dodatnich liczb całkowitych został sformułowany
w IV w. p.n.e. przez Euklidesa
Algorytm Euklidesa
• Program to lista szczegółowych instrukcji przekazywanych komputerowi do realizacji określonych zadań
Co to jest program?
Składniki
Przepis
Kucharz i kuchnia Danie
Gotowanie
Dane
Program
Komputer
Wynik
Informatyka
Program i przepis a algorytm
• Algorytm może być zapisywany na różne sposoby: językiem naturalnym,
pseudokodem, schematem blokowym, językiem programowania
Zapis algorytmów
• 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
Znajdowanie elementu maksymalnego w tablicy
start
dane: tablica t i jej rozmiar n m = t[0]
jeśli i < n i = 1
jeśli t[i] > m
m = t[i]
i = i + 1 koniec
TAK NIE
TAK NIE
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 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
Znajdowanie pozycji elementu
maksymalnego w tablicy
• 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
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
• 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 bąbelkowe
• 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
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
• 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
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
Scalanie
Sortowanie przez scalanie
5 7 8 4 6 1 3 2
5 7 8 4 6 1 3 2
4 5 7 8 1 2 3 6
Sortowanie przez scalanie
5 7 8 4 6 1 3 2
5 7 8 4 6 1 3 2
4 5 7 8 1 2 3 6
1
Sortowanie przez scalanie
5 7 8 4 6 1 3 2
5 7 8 4 6 1 3 2
4 5 7 8 1 2 3 6
1
Sortowanie przez scalanie
5 7 8 4 6 1 3 2
5 7 8 4 6 1 3 2
4 5 7 8 1 2 3 6
1 2
Sortowanie przez scalanie
5 7 8 4 6 1 3 2
5 7 8 4 6 1 3 2
4 5 7 8 1 2 3 6
1 2 3
Sortowanie przez scalanie
5 7 8 4 6 1 3 2
5 7 8 4 6 1 3 2
4 5 7 8 1 2 3 6
1 2 3 4
Sortowanie przez scalanie
5 7 8 4 6 1 3 2
5 7 8 4 6 1 3 2
4 5 7 8 1 2 3 6
1 2 3 4 5
Sortowanie przez scalanie
5 7 8 4 6 1 3 2
5 7 8 4 6 1 3 2
4 5 7 8 1 2 3 6
1 2 3 4 5 6
Algorytmy sortowania
Sortowanie przez scalanie
5 7 8 4 6 1 3 2
5 7 8 4 6 1 3 2
4 5 7 8 1 2 3 6
1 2 3 4 5 6 7 8
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
Scalanie
• 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
Sortowanie szybkie
Algorytmy sortowania
Sortowanie szybkie
5 7 8 4 6 1 3 2
2 7 8 4 6 1 3 5
2 7 8 4 6 1 3 5
Algorytmy sortowania
Sortowanie szybkie
5 7 8 4 6 1 3 2
2 7 8 4 6 1 3 5
2 7 8 4 6 1 3 5
Algorytmy sortowania
Sortowanie szybkie
5 7 8 4 6 1 3 2
2 7 8 4 6 1 3 5
2 7 8 4 6 1 3 5
Algorytmy sortowania
Sortowanie szybkie
5 7 8 4 6 1 3 2
2 7 8 4 6 1 3 5
2 7 8 4 6 1 3 5
Algorytmy sortowania
Sortowanie szybkie
5 7 8 4 6 1 3 2
2 7 8 4 6 1 3 5
2 4 8 7 6 1 3 5
Algorytmy sortowania
Sortowanie szybkie
5 7 8 4 6 1 3 2
2 7 8 4 6 1 3 5
2 4 8 7 6 1 3 5
Algorytmy sortowania
Sortowanie szybkie
5 7 8 4 6 1 3 2
2 7 8 4 6 1 3 5
2 4 8 7 6 1 3 5
Algorytmy sortowania
Sortowanie szybkie
5 7 8 4 6 1 3 2
2 7 8 4 6 1 3 5
2 4 1 7 6 8 3 5
Algorytmy sortowania
Sortowanie szybkie
5 7 8 4 6 1 3 2
2 7 8 4 6 1 3 5
2 4 1 7 6 8 3 5
Algorytmy sortowania
Sortowanie szybkie
5 7 8 4 6 1 3 2
2 7 8 4 6 1 3 5
2 4 1 3 6 8 7 5
Algorytmy sortowania
Sortowanie szybkie
5 7 8 4 6 1 3 2
2 7 8 4 6 1 3 5
2 4 1 3 6 8 7 5
Algorytmy sortowania
Sortowanie szybkie
5 7 8 4 6 1 3 2
2 7 8 4 6 1 3 5
2 4 1 3 5 8 7 6
Algorytmy sortowania
Sortowanie szybkie
5 7 8 4 6 1 3 2
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
• W złożonych programach istnieje
konieczność rozdzielenia kodu źródłowego na kilka plików
Pliki nagłówkowe
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
• Przed napisaniem programu przeanalizuj działanie algorytmu
• Złożony program rozdziel na kilka plików źródłowych