Wybrane algorytmy tablicowe Algorytmy i struktury danych Wykład 2. Rok akademicki: 2009/2010 Sortowanie przez wybieranie for (int i = 0; i < liczby.length - 1; i++) k = i; for (int j = i; j < liczby.length; j++) if (liczby[k] > liczby[j]) k = j; pomoc = liczby[i]; liczby[i] = liczby[k]; liczby[k] = pomoc; Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 2 1
Sortowanie przez wstawianie for (int i = 1; i < liczby.length; i++) pomoc = liczby[i]; j = i - 1; while ((j >= 0) && (pomoc < liczby[j])) liczby[j+1] = liczby[j]; j--; liczby[j+1] = pomoc; Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 3 Sortowanie bąbelkowe for (int i = 1; i < liczby.length; i++) for (j = liczby.length - 1; j >= i; j--) if (liczby[j-1] > liczby[j]) pomoc = liczby[j]; liczby[j] = liczby[j-1]; liczby[j-1] = pomoc; Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 4 2
Sito Eratostenesa (1/2) Sito Eratostenesa - algorytm pozwala na wyznaczenie liczb pierwszych mniejszych lub równych wartości N. Tworzymy listę wszystkich liczb naturalnych od 2 do N. Pierwsza liczba na liście jest liczbą pierwszą. Usuwamy z listy wszystkie wielokrotności wyznaczonej liczby pierwszej. Powtarzamy kroki 2 oraz 3 aż do momentu usunięcia wszystkich liczb z listy. Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 5 Sito Eratostenesa (2/2) Kolejna liczba pierwsza: 3 Kolejna liczba pierwsza: 5 Kolejna liczba pierwsza: 7 Kolejna liczba pierwsza: 11 Kolejna liczba pierwsza: 13 Kolejna liczba pierwsza: 17 Kolejna liczba pierwsza: 19 Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 6 3
Inwersja elementów w wektorze wersja iteracyjna import java.io.*; public class ParametryTablicowe static void drukuj(string s) System.out.print(s); static int czytajliczbe() throws IOException BufferedReader klaw = new BufferedReader (new InputStreamReader (System.in)); return Integer.parseInt(klaw.readLine()); Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 7 Inwersja elementów w wektorze wersja iteracyjna static int [] tworzwektor(int ileelementow) // metoda zwraca referencje do tablicy int [] tab = new int[ileelementow]; for(int i = 0; i < tab.length; i++) tab[i] = i; return tab; static void drukujwektor(int [] tab) for (int i = 0; i < tab.length; i++) drukuj(tab[i] + " "); drukuj("\n"); Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 8 4
Inwersja elementów w wektorze wersja iteracyjna static void inwersja(int [] tab) // metoda modyfikuje tablice przekazana jako parametr int i = 0; int j = tab.length - 1; int pomoc; while (i < j) pomoc = tab[i]; tab[i] = tab[j]; tab[j] = pomoc; i++; j--; Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 9 Inwersja elementów w wektorze wersja iteracyjna public static void main(string[] args) throws IOException drukuj("podaj liczbe elementow w wektorze: "); int ileelementow = czytajliczbe(); int [] wektor = tworzwektor(ileelementow); drukujwektor(wektor); inwersja(wektor); drukujwektor(wektor); Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 10 5
Tworzenie k-elementowych kombinacji bez powtórzeo n- elementowego zbioru Niech A oznacza zbiór składający się z n elementów. k-elementową kombinacją bez powtórzeń (k n) elementów zbioru A nazywamy każdy k-elementowy podzbiór zbioru A. Ilość k-elementowych kombinacji bez powtórzeń n elementów równa się: n k n! k! n k! Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 11 Tworzenie k-elementowych kombinacji bez powtórzeo n- elementowego zbioru Przykład Napisać program wyświetlający wszystkie k-elementowe kombinacje bez powtórzeń elementów zbioru obejmującego liczby naturalne od 1 do n (przyjmij, że wartości n oraz k podawane będą przez użytkownika w trakcie działania programu. Użytkownik określił wartości parametrów w następujący sposób: n = 4 k = 3 Liczba kombinacji: 4 Program wyświetlił wyniki: 1, 2, 3 1, 2, 4 1, 3, 4 2, 3, 4 Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 12 6
Tworzenie k-elementowych kombinacji bez powtórzeo n- elementowego zbioru Elementy wchodzące w skład każdej kombinacji wyświetlane będą w kolejności rosnącej - dzięki czemu możemy określid wartości maksymalne, które mogą się pojawid na kolejnych pozycjach: na pozycji k będzie to wartośd n, na pozycji k-1 będzie to n-1, itd. Kolejne kombinacje prezentowane są w porządku leksykograficznym (uporządkowanie słownikowe) - jeżeli byśmy przyjęli, że liczby wchodzące w skład danej kombinacji są kodami znaków, to utworzone w ten sposób słowa uporządkowane byłyby alfabetycznie. Czyli pierwsza kombinacja (dla n = 4 i k = 3) ma postad: 1, 2, 3. Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 13 Tworzenie k-elementowych kombinacji bez powtórzeo n- elementowego zbioru Przy generowaniu każdej następnej kombinacji realizuję kroki: indeks = k (numer rozpatrywanego elementu w kombinacji) max = n (wartośd maksymalna na pozycji indeks) wyszukuję pierwszą (od prawej strony pozycję), na której mogę umieścid wartośd większą od dotychczasowej (kolejno zmniejszam indeks oraz max) zwiększam wartośd znajdującą się na pozycji indeks o jeden na kolejne pozycje (czyli od pozycji indeks+1 do k) wpisuję kolejne liczby (na pozycji indeks+1 umieszczona zostanie wartośd o jeden większa od wartości znajdującej się na pozycji indeks, na pozycji indeks+2 znajdzie się wartośd o jeden większa od wartości znajdującej się na pozycji indeks+1, itd.) wyświetlam utworzoną w ten sposób kombinację. Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 14 7
Permutacje bez powtórzeo Niech A oznacza zbiór składający się z n elementów. Permutacją bez powtórzeo elementów zbioru A nazywamy każdy ciąg n-elementowy (a 1, a 2,..., a n ), składający się z różnych elementów zbioru A. Ilośd permutacji bez powtórzeo elementów zbioru A wynosi n!. Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 15 Permutacje bez powtórzeo Przykład Napisz program wyświetlający wszystkie permutacje elementów zbioru liczb całkowitych obejmującego kolejne wartości od 1 do n (wartość n ma być podawana w trakcie działania programu). Przykład n = 3 Liczba permutacji: 3! = 6 Wyniki działania programu: 1, 2, 3 1, 3, 2 2, 1, 3 2, 3, 1 3, 1, 2 3, 2, 1 Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 16 8
Permutacje bez powtórzeo algorytm Dijkstry kolejne permutacje wyświetlane będą w porządku leksykograficznym pierwsza permutacja ma postad: 1, 2,... n zakładam, że elementy tworzące permutację przechowywane są w wektorze a indeksowanym wartościami od 1 do n Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 17 Permutacje bez powtórzeo algorytm Dijkstry przy generowaniu każdej następnej permutacji realizowane są następujące kroki: na podstawie bieżącej permutacji wyznaczana jest wartośd i, która jest maksymalną wartością indeksu, dla której spełniony jest warunek: a[i] < a[i+1] Przykład: dla a = *1 4 6 2 9 5 8 7 3+ poszukiwana wartośd i wynosi 6 fragment wektora a od pozycji i+1 do kooca nazywany jest ogonem. Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 18 9
Permutacje bez powtórzeo algorytm Dijkstry poszukujemy wartości j (przy czym j spełniad musi warunek: i+1 j n, czyli jest indeksem elementu znajdującego się w ogonie wektora a), dla której a[j] jest najmniejszą wartością spełniającą warunek a*j+ > a*i+ Przykład: dla wektora zdefiniowanego powyżej j jest równe 8 dokonujemy zamiany elementów znajdujących się na pozycji i oraz j Przykład: w powyższym przypadku uzyskujemy: a = *1 4 6 2 9 7 8 5 3+ odwracamy kolejnośd elementów znajdujących się w ogonie wektora a Przykład: w powyższym przypadku uzyskujemy: a = *1 4 6 2 9 7 3 5 8+ Paweł Lula, Katedra Systemów Obliczeniowych, Uniwersytet Ekonomiczny w Krakowie 19 10