Lekcja 5: Algorytmy wyszukiwania i sortowania. Odpowiedź
S. Hoa Nguyen
1 Materiał
1. Problem k-tego co do wielkości
• Algorytm Hoare.
• Algorytm BFPRT (Bluma-Floyda-Pratta-Rivesta-Trajana) - Magiczne piątki.
• Algorytm sortowania SelectionSort, InsertionSort, QuickSort.
2 Zadania
1. Załóżmy, że pewien algorytm A, dla danego ciągu wejściowego S rozmiaru n składa się z trzech części A1, A2, A3:
• A1- wyszukanie drugiego co do wielkości elementu w S zapomocą metody optymalnej,
• A2 - wyszukanie jednocześnie minimalnego oraz maksymalnego elementu w S za pomocą metody optymalnej,
• A3- wyszukanie k-tego co do wielkości elementu w S za pomocą algorytmu Hoare’a.
Podaj dokładne oszacowanie złożoności całego algorytmu w przypadku oczekiwanym (średnim) i pesymistycznym.
Odpowiedź: A(n) = Θ(n) + Θ(n) + Θ(n) = Θ(n) W (n) = Θ(n) + Θ(n) + Θ(kn) = Θ(kn)
2. Przedstaw działanie algorytmu Split((Rysunek ??) i Partition (Rysunek ??) zastosowanego do następującego ciągu:
[9, 3, 2, 10, 7, 15, 4, 5, 12, 13, 14, 1, 11, 3, 23, 20]
Odpowiedź: na Rysunku 1
3. Przedstaw działanie algorytmu Hoare’a wyszukiwania 5-tego elementu co do wielkości w podanym niżej ciągu:
[9, 3, 2, 10, 7, 15, 4, 5, 12, 13, 14, 1, 11, 3, 23, 20]
Odpowiedź:
Algorytm HoarePartition: k =5 I iteracja: Partition dla pełnej tablicy:
9, 3, 2, 10, 7, 15, 4, 5, 12, 13, 14, 1, 11, 3, 23, 20
Rysunek 1: Symulacja Partition i Split
(23 <-> 20)
9, 3, 2, 10, 7, 15, 4, 5, 12, 13, 14, 1, 11, 3, 20, 23
II iteracja: Partition dla tablicy po lewej stronie mediany 20 (k=3):
9, 3, 2, 10, 7, 15, 4, 5, 12, 13, 14, 1, 11, 3 ( 9<->3, 9<->2,9<->1,10<->3)
3, 2, 1, 3, 7, 15, 4, 5, 12, 13, 14, 9, 11, 10
III iteracja: Partition dla tablicy po prawej stronie mediany 3 (k=3):
7, 15, 4, 5, 12, 13, 14, 9, 11, 10 (15 <->4, 15 <->5, 15 <-> 9, 12 <->10)
7, 4, 5, 9, 10, 13, 14, 15, 11, 12
IV iteracja: Partition dla tablicy po prawej stronie mediany 10 (k=3):
13, 14, 15, 11, 12 (13 <->11,14 <->12)
11, 12, 15, 13, 14
V iteracja: Partition dla tablicy po prawej stronie mediany 12 (k=3):
15, 13, 14 (15 <-> 13, 15 <->14)
13, 14, 15
VI iteracja: Partition dla tablicy po lewej stronie mediany (k=1):
13
Stop. Odpowiedź: piąty element co do wielkości jest 13.
4. Przeanalizuje działanie algorytmu BF P RT kolejno dla ciągu:
[10, 2, 5, 10, 8, 3, 4, 7, 9, 7, 6, 10, 5, 8, 4]
5. 2. Przedstaw działania algorytmów SelectionSort, InsertionSort i QuickSort na ciągu wejściowym:
[4, 6, 1, 8, 3, 4, 2, 5, 9, 12, 7, 10, 13, 0]
(a) InsertionSort: 4, 6, 1, 8, 3, 4, 2, 5, 9, 12, 7, 10, 13, 0 (6<->1, 4<->1) 1, 4, 6, 8, 3, 4, 2, 5, 9, 12, 7, 10, 13, 0 (8<->3, 6<->3, 4 <-> 3)
1, 3, 4, 6, 8, 4, 2, 5, 9, 12, 7, 10, 13, 0 (8<->4, 6<->4)
1, 3, 4, 4, 6, 8, 2, 5, 9, 12, 7, 10, 13, 0 (8<->2, 6<->2,4<->2,4<->2,3<->2)
1, 2, 3, 4, 4, 6, 8, 5, 9, 12, 7, 10, 13, 0 (8<->5, 6<->5)
1, 2, 3, 4, 4, 5, 6, 8, 9, 12, 7, 10, 13, 0 (12<->7, 9<->7, 8<->7)
1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 12, 10, 13, 0 (12<->10)
1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10, 12, 13, 0 (13<->0, 12 <->0, 10<->0, 9 <->0, 8<->0,..., 1<->0) Wynik: 0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 12, 10, 13
(b) SelectionSort:
4, 6, 1, 8, 3, 4, 2, 5, 9, 12, 7, 10, 13, 0 (4 <->0)
0, 6, 1, 8, 3, 4, 2, 5, 9, 12, 7, 10, 13, 4 (6<->1)
0, 1, 6, 8, 3, 4, 2, 5, 9, 12, 7, 10, 13, 4 (6<->2)
0, 1, 2, 8, 3, 4, 6, 5, 9, 12, 7, 10, 13, 4 (8<->3)
0, 1, 2, 3, 8, 4, 6, 5, 9, 12, 7, 10, 13, 4 (8<->4)
0, 1, 2, 3, 4, 8, 6, 5, 9, 12, 7, 10, 13, 4 (8<->4)
0, 1, 2, 3, 4, 4, 6, 5, 9, 12, 7, 10, 13, 8 (6<->5)
0, 1, 2, 3, 4, 4, 5, 6, 9, 12, 7, 10, 13, 8 (9<->7)
0, 1, 2, 3, 4, 4, 5, 6, 7, 12, 9, 10, 13, 8 (12<->8)
0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10, 13, 12 (13<->12)
Wynik: 0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10, 12, 13 (c) QuickSortPartition
I iteracja: Partition dla całej tablicy:
4, 6, 1, 8, 3, 4, 2, 5, 9, 12, 7, 10, 13, 0 (4 <->0)
0, 6, 1, 8, 3, 4, 2, 5, 9, 12, 7, 10, 13, 4
II iteracja: Lewa tablica jest pusta, zatem Partition dla prawej tablicy (mediana 0):
6, 1, 8, 3, 4, 2, 5, 9, 12, 7, 10, 13, 4
(6 <->1,6<->3,8<->4, 6<->2, 8<->4)
1, 3, 4, 2, 4, 6, 5, 9, 12, 7, 10, 13, 8 III iteracja: Partition dla lewej tablicy (mediana 4):
1, 3, 4, 2 (3 <->2)
1, 2, 4, 3
IV iteracja: Lewa tablica zawiera jeden element, zatem Partition dla prawej tablicy (me- diana 2):
4, 3 (4 <->3)
3, 4
Lewa tablica (mediana 3) jest pusta, prawa tablica zawiera jeden element ->stop.
Lewa tablica (mediana 4) została uporządkowana:
1, 2, 3, 4
V iteracja: Partition dla prawej tablicy (mediana 4):
6, 5, 9, 12, 7, 10, 13, 8 (9 <->7, 12 <->8)
6, 5, 7, 8, 9, 10, 13, 12
VI iteracja: Partition dla lewej tablicy (mediana 8):
6, 5, 7 (mediana 7) (bez zmian)
VII iteracja: Partition dla lewej tablicy (mediana 7):
6, 5 (mediana 5) (6<->5)
5, 6
Lewa tablica (mediana 8) została uporządkowana: [5, 6,7, 8]
VIII iteracja: Partition dla prawej tablicy (mediana 8):
9, 10, 13, 12
( 13 <->12)
9, 10, 12, 13
IX iteracja: Partition dla lewej tablicy (mediana 12):
9, 10 (bez zmian) -> stop
Prawa tablica (mediana 8) została uporządkowana: [9, 10, 12, 13]
Prawa tablica (mediana 4) została uporządkowana: [5, 6, 7, 8, 9, 10, 12, 13]
Prawa tablica (mediana 0) została uporządkowana: [1,2, 3, 4, 4, 5, 6, 7, 8, 9, 10, 12, 13]
Cała tablica została uporządkowana: [0, 1,2, 3, 4, 4, 5, 6, 7, 8, 9, 10, 12, 13]