Informatyka A Algorytmy Spis algorytmów 1 Algorytm Euklidesa....................................... 2 2 Rozszerzony algorytm Euklidesa................................ 2 3 Wyszukiwanie min w tablicy.................................. 2 4 Jednoczesne wyszukiwanie min i max w tablicy........................ 2 5 Schemat Hornera......................................... 3 6 Potęgowanie binarne....................................... 3 7 Zamiana z systemu dziesiętnego na system o innej podstawie................ 3 8 Rozwiązywanie liniowego równania diofantycznego...................... 3 9 Wyszukiwanie liniowe (sekwencyjne).............................. 4 10 Wyszukiwanie z wartownikiem................................. 4 11 Wyszukiwanie binarne...................................... 4 12 Sortowanie bąbelkowe...................................... 4 13 Sortowanie przez wybieranie (selekcję)............................. 5 14 Sortowanie przez wstawianie.................................. 5 15 Sortowanie przez zliczanie.................................... 5 16 Sortowanie przez scalanie.................................... 6 17 Scalanie tablic.......................................... 6 18 Sortowanie szybkie (quicksort)................................. 7 19 Obliczanie miejsca zerowego metodą połowienia....................... 8 20 Obliczanie miejsca zerowego metodą siecznych........................ 9 21 Sito Eratostenesa........................................ 9 22 Algorytm obliczania n-tego wyrazu ciągu Fibonacciego................... 10 23 Rekurencyjny algorytm Euklidesa............................... 10 24 Rekurencyjne podnoszenie do potęgi.............................. 10 25 Wyszukiwanie binarne - wersja rekurencyjna......................... 11 26 Szybkie podnoszenie do potęgi................................. 11 27 Wyszukiwanie min w tablicy - wersja rekurencyjna...................... 11 28 Algorytm obliczania n-tego wyrazu ciągu Fibonacciego - wersja wstępująca........ 12 29 Algorytm obliczania n-tego wyrazu ciągu Fibonacciego - wersja zstępująca........ 12 1
Algorytm 1: Algorytm Euklidesa Dane: a, b N + Wynik: NW D(a, b) while b 0 do c = a mod b a = b b = c Pisz a Algorytm 2: Rozszerzony algorytm Euklidesa Dane: a, b N + Wynik: d = NW D(a, b), {u, v} takie, że ua + vb = d (u 1, r 1, u 2, r 2 ) = (1, a, 0, b) while r 2 > 0 do q = r1 r 2 (u 1, r 1, u 2, r 2 ) = (u 2, r 2, u 1 q u 2, r 1 q r 2 ) Pisz d = r 1, {u, v} = (u 1, r 1 u 1 a b ) Algorytm 3: Wyszukiwanie min w tablicy Dane: T [1... n] Wynik: min(t [1],..., T [n]) min = 1 for i = 2,..., n do if T [i] < T [min] then min = i Pisz T [min] 2
Algorytm 4: Jednoczesne wyszukiwanie min i max w tablicy Dane: T [1... n] Wynik: min(t [1],..., T [n]), max(t [1],..., T [n]) 1. Jeśli n = 1, to min = max = T [1] 2. W kolejnych parach elementów umieść na pozycji nieparzystej element lżejszy, na parzystej element cięższy. Jeśli n jest nieparzyste, to ostatni element ciągu oznacz przez e 3. Szukamy elementu minimalnego dla indeksów nieparzystych, elementu maksymalnego dla indeksów parzystych 4. Jeśli n jest nieparzyste, to porównaj otrzymane wartości z e Algorytm 5: Schemat Hornera Dane: f(x) = a 0 X n + a 1 X n 1 +... + a n 1 X + a n, x 0 R Wynik: f(x 0 ) w = a 0 for i = 1,..., n do w = w x 0 + a i Pisz w Algorytm 6: Potęgowanie binarne Dane: b R, n N {0} Wynik: b n x = 1 z = b i = n while i > 0 do if i mod 2 = 1 then x = x z z = z z i = i 2 Pisz x Algorytm 7: Zamiana z systemu dziesiętnego na system o innej podstawie Dane: n N liczba w systemie dziesiętnym, p N podstawa systemu Wynik: n w systemie o podstawie p // T [1... log p n + 1] - tablica z cyframi liczby n w systemie o podstawie p k = 1 while n > 0 do T [k] = n mod p k = k + 1 n = n p for i = k 1,..., 1 do Pisz T [i] 3
Algorytm 8: Rozwiązywanie liniowego równania diofantycznego Dane: a, b, c Z takie, że ax + by = c Wynik: Rozwiązanie ogólne równania ax + by = c (d, u, v) = RozszerzonyAlgorytmEuklidesa(a, b) if c mod d = 0 then Pisz x = c u d + t b d Pisz y = c v d t a d Pisz Brak rozwiązań Algorytm 9: Wyszukiwanie liniowe (sekwencyjne) Dane: T 1,..., T n, K poszukiwany element Wynik: Indeks i {1,..., n} taki, że T i = K. W przypadku, gdy takie i nie istnieje zwracamy 1 1. i = 1 2. Jeśli K = T i, to zakończ działanie algorytmu i zwróć i 3. i = i + 1 4. Jeśli i n, to wróć do 2 w przeciwnym razie zakończ działanie algorytmu i zwróć 1 Algorytm 10: Wyszukiwanie z wartownikiem Dane: T 1,..., T n, K poszukiwany element Wynik: Indeks i {1,..., n} taki, że T i = K. W przypadku, gdy takie i nie istnieje zwracamy 1 1. i = 1, T n+1 = K 2. Jeśli T i = K, to idź do 4 3. i = i + 1, idź do 2 4. Jeśli i n, to zwróć i, w przeciwnym przypadku 1 4
Algorytm 11: Wyszukiwanie binarne Dane: A posortowana tablica, v poszukiwany element, l, r zakres w jakim poszukujemy Wynik: Indeks poszukiwanego elementu, w przypadku nie znalezienia elementu zwracamy 1 while r l do m = l+r 2 if v = A[m] then return m if v < A[m] then r = m 1 l = m + 1 return 1 Algorytm 12: Sortowanie bąbelkowe Dane: T [1... n] Wynik: Posortowana tablica T for j = 1,..., n 1 do for i = 1,..., n 1 do if T [i] > T [i + 1] then zamień(t [i], T [i + 1]) Algorytm 13: Sortowanie przez wybieranie (selekcję) Dane: T [1... n] Wynik: Posortowana tablica T for i = 1,..., n 1 do min = i for j = i + 1,..., n do if T [j] < T [min] then min = j zamień(t [i], T [min]) Algorytm 14: Sortowanie przez wstawianie Dane: T [1... n] Wynik: Posortowana tablica T for i = 2,... n do x = T [i] j = i 1 while j > 0 and x < T [j] do T [j + 1] = T [j] j = j 1 T [j + 1] = x 5
Algorytm 15: Sortowanie przez zliczanie Dane: A[1... n] tablica liczb naturalnych z przedziału [1, k] Wynik: Posortowana tablica A // B[1... n] - tablica posortowana // C[1... k] - tablica pomocnicza for i = 1,..., k do C[i] = 0 for i = 1,..., n do C[A[i]] = C[A[i]] + 1 for i = 2,..., k do C[i] = C[i] + C[i 1] for i = 1,..., n do B[C[A[i]]] = A[i] C[A[i]] = C[A[i]] 1 // C[i] liczba elementów = i // C[i] liczba elementów i Algorytm 16: Sortowanie przez scalanie Dane: A[1... n] tablica liczb naturalnych Wynik: Posortowana tablica A MergeSort(A, n) M sort(a, 1, n) M sort(a, l, r) if l < r then m = l+r 2 M sort(a, l, m) M sort(a, m + 1, r) Scalaj(A, l, m, r) 6
Algorytm 17: Scalanie tablic Dane: A[1... n] tablica liczb naturalnych, m - rozmiar tablicy Wynik: Posortowana tablica A Scalaj(A, l, m, r) C //- tablica pomocnicza i = l; j = m + 1; k = l; while i m and j r do if A[i] A[j] then C[k] = A[i] i = i + 1 C[k] = A[j] j = j + 1 k = k + 1 while i m do C[k] = A[i] i = i + 1 k = k + 1 while j r do C[k] = A[j] j = j + 1 k = k + 1 for k = l to r do A[k] = C[k] 7
Algorytm 18: Sortowanie szybkie (quicksort) Dane: T [1... n] Wynik: Posortowana tablica T Quicksort(A, n) Q sort(a, 1, n) Q sort(a, l, r) if l < r then j =Podział(A, l, r) Q sort(a, l, j 1) Q sort(a, j + 1, r) Podział(A, l, r) x = A[l] i = l + 1 j = r koniec = false while not koniec do while j > l and x A[j] do j = j 1 while i < r and x > A[i] do i = i + 1 if i < j then zamień(a[i], A[j]) j = j 1 i = i + 1 koniec = true A[l] = A[j] A[j] = x return j 8
Algorytm 19: Obliczanie miejsca zerowego metodą połowienia Dane: Funkcja ciągła f, końce przedziału a, b R, f(a)f(b) < 0 Wynik: x 0 R takie, że f(x 0 ) = 0 // ε dokładność z jaką chcemy liczyć miejsce zerowe f a = f(a) f b = f(b) while a b > ε do x 0 = a+b 2 f 0 = f(x 0 ) if f 0 = 0 then break if f a f 0 < 0 then b = x 0 a = x0 Pisz x 0 f a = f 0 9
Algorytm 20: Obliczanie miejsca zerowego metodą siecznych Dane: Funkcja ciągła f, końce przedziału x 1, x 2 R Wynik: x 0 R takie, że f(x 0 ) = 0 // ε dokładność z jaką chcemy liczyć miejsce zerowe // n maksymalna ilość przebiegów algorytmu f 1 = f(x 1 ) f 2 = f(x 2 ) i = n while i > 0 and x 1 x 2 > ε do x x 0 = x 1 f 1 x 2 1 f 1 f 2 f 0 = f(x 0 ) x 2 = x 1 f 2 = f 1 x 1 = x 0 f 1 = f 0 i = i 1 if i = 0 then Pisz Przekroczony limit przebiegów Pisz x 0 Algorytm 21: Sito Eratostenesa Dane: n N Wynik: Tablica zawierająca liczby pierwsze n Utwórz listę L = {1,..., n} L[1] = 0 k = n for i = 2,..., k do if L[i] 0 then for j = i 2, i 2 + i, i 2 + 2i,..., n do L[j] = 0 for i = 2,..., n do if L[i] 0 then Pisz i 10
Algorytm 22: Algorytm obliczania n-tego wyrazu ciągu Fibonacciego Dane: n N Wynik: n-ty wyraz ciągu Fibonacciego Function Fibonacci(n N) if ((n = 0) or (n = 1) ) then return n return Fibonacci (n 1)+Fibonacci (n 2) Algorytm 23: Rekurencyjny algorytm Euklidesa Dane: a, b N Wynik: NW D(a, b) Function Euklides(a N, b N) if (b = 0) then return a return Euklides (b, a mod b) Algorytm 24: Rekurencyjne podnoszenie do potęgi Dane: a, n N Wynik: a n Function Potega(a N, n N) if (n = 1) then return a if (n mod 2 = 0) then p =Potega(a, n/2) return p p p =Potega(a, (n 1)/2) return p p a 11
Algorytm 25: Wyszukiwanie binarne - wersja rekurencyjna Dane: A posortowana tablica, v poszukiwany element, l, r zakres w jakim poszukujemy Wynik: Indeks poszukiwanego elementu, w przypadku nie znalezienia elementu zwracamy 1 Function wysz-binarne(a, v N, l N, r N) if l r then return 1 m = l+r 2 if v = A[m] then return m if v < A[m] then return wysz-binarne(a, v, l, m 1) return wysz-binarne(a, v, m + 1, r) Algorytm 26: Szybkie podnoszenie do potęgi Dane: a, n N Wynik: a n Function szybkie-potega(a N, n N) if (n = 1) then return a m = n 2 p = szybkie-potega(a, m) p = p p if (n mod 2 = 1) then p = p a return p Algorytm 27: Wyszukiwanie min w tablicy - wersja rekurencyjna Dane: T [1... n], l, r N, gdzie l, r to odpowiednio prawy i lewy koniec tablicy Wynik: min(t [1],..., T [n]) Function minimum(t [1 n], l, r) if l r = 0 then return T [l] m = l+r 2 x =minimum(t, l, m) y =minimum(t, m + 1, r) if x < y then return x return y 12
Algorytm 28: Algorytm obliczania n-tego wyrazu ciągu Fibonacciego - wersja wstępująca Dane: n N Wynik: n-ty wyraz ciągu Fibonacciego Function Fibonacci-wstępujący(n N) F [0] = 0 F [1] = 1 for i = 2 to n do F [i] = F [i 1] + F [i 2] Algorytm 29: Algorytm obliczania n-tego wyrazu ciągu Fibonacciego - wersja zstępująca Dane: n N Wynik: n-ty wyraz ciągu Fibonacciego Function Fibonacci-zstępujący(n N) if F [n] = 0 then t = n if n > 1 then t=fibonacci-zstępujący(n 1)+Fibonacci-zstępujący(n 2) F [n] = t return F [n] 13