Algorytmy i programowanie Zadania domowe 6 0. Zapoznać się z
Transkrypt
Algorytmy i programowanie Zadania domowe 6 0. Zapoznać się z
Algorytmy i programowanie Zadania domowe 6 0. Zapoznać się z implementacjami algorytmów sortowania - to zadanie zostanie ocenione na następnym kolokwium. 1. Czy poniższy algorytm scalania z wartownikami dwóch posortowanych rosnąco ciągów znajdujących się w tablicy A w odpowiednich częściach A [p..q] i A [q + 1..r] jest prawidłowy? Odpowiedź uzasadnij. Scal (A, p, q, r) for i ← 0 to q − p do B [i + 1] ← A [p + i] B [q − p + 2] ← ∞ for j ← 0 to r − q − 1 do B [j + q − p + 3] ← A [q + j + 1] B [r − p + 2] ← ∞ i←1 j ←q−p+3 for k ← p to r do if B [j] < B [i] then A [k] ← B [j] j ←j+1 else A [k] ← B [i] i←i+1 2. Napisać pseudokod zmodyfikowanego algorytmu szybkiego sortowania, według poniżej opisanego sposobu: Grupa A W procedurze podziału tablicy A [p..r] zaprezentowanej na wykładzie jako element podziałowy wybierany jest ostatni element dzielonej tablicy A [r] - nie zawsze jest to wybór optymalny! Lepszym rozwiązaniem byłoby element podziałowy wybrać spośród trzech elementów tablicy: pierwszego A [p], ostatniego A [r] i środkowego A [(p + q) div 2], jako ich wartość środkową (czyli dla a ¬ b ¬ c będzie to b). Grupa B Podczas rekurencyjnego wykonania algorytmu szybkiego sortowania w pewnym momencie otrzymujemy posortowaną tablicę jednoelementową! Innym rozwiązaniem mogłoby być na pewnym poziomie zatrzymanie rekurencyjnych wywołań algorytmu szybkiego sortowania i na wyznaczonych podtablicach wykonanie ulubionego algorytmu sortowania innego niż szybkie! Niech moment, w którym zmodyfikowany algorytm szybkiego sortowania wywoła inny algorytm sortowania, będzie wyznaczony przez długość tablicy - mniejszą bądź równą sqrt (n) , gdzie n jest długością wejściowej sortowanej tablicy, a nie podtablicy w kolejnym wywołaniu szybkiego sortowania.