Na początek porównujemy pierwszy element z drugim. Mniejszy przyjmujemy jako minimum, a drugi jako maksimum. Następnie analizujemy kolejne dwa elementy. Porównujemy je. Mniejszy porównujemy z aktualnym minimum, a większy z maksimum id odpowiednio przypisujemy wartości. Pozostaje kwestia wyjaśnienia co jeśli lista ma nieparzystą liczbę elementów. W takim przypadku ostatni element na liście porównujemy z minimum oraz maksimum.
Weźmy przykładowo listę L:={4, 6, 5, 7, 2, 1, 3}. Algorytm zaczynamy od porównania dwóch pierwszych elementów: 6 > 4, więc przyjmujemy, że minimum to 4, a maksimum to 6. Następnie kroki porównywania przedstawia tabelka: (kursywą zostało zapisane porównanie udowadniające przypisanie nowej wartości)
Porównane el. | Wynik | Minimum | Maksimum |
---|---|---|---|
5, 7 | 5 < 7 | 4 | 7 (7 > 6) |
2, 1 | 2 > 1 | 1 (1 < 4) | 7 |
Pozostał jeden element na liście. Zgodnie z algorytmem porównujemy go z minimum oraz maksimum: 3 > 1 i 3 < 7 czyli nie zmieniamy maksimum oraz minimum. W ten sposób wiemy, że minimum to 1, a maksimum to 7.
Zastanówmy się teraz nad złożonością algorytmu. Dla każdej pary wykonujemy dokładnie 3 porównania. Daje to jedno porównanie mniej niż w przypadku poszukiwania liniowego. Złożoność algorytmu wynosi Θ(n). Należy jednak zauważyć, że jest to szybszy algorytm od tradycyjnego wyszukiwania liniowego, gdzie wykonujemy 2(n - 1) porównań.
Funkcja, która będzie wyszukiwać równocześnie MIN i MAX przyjmuje cztery argumenty: lista - lista liczb, n - ilość elementów na liście oraz wskaźniki gdzie znajdują się wartości min i max.
(1.) Nasza funkcja przyjmuje cztery argumenty: lista - lista liczb rzeczywistych, n - określa ile elementów ma lista. Ostatnie dwa to min i max. To odpowiednio element minimalny i maksymalny. (2.) Nasz pierwszy krok polega wyznaczeniu początkowej wartości minimum i maksimum. Porównujemy dwa pierwsze elementy i odpowiednio przypisujemy wartości min oraz max. Jeśli pierwszy większy od drugiego to (3. - 4.), a w przeciwnym wypadku (6. - 7.).
(9.) Iteracje rozpoczniemy od trzeciego elementu. (10.) Musimy też prawidłowo wyznaczyć do którego elementu będziemy wykonywać iteracje. W przypadku parzystej liczby elementów to n - 1. W przypadku nieparzystej ilości nie rozpatrujemy ostatniego elementu czyli dl = n - 2.
(11.) W pętli porównujemy kolejne pełne pary elementów. Zmienne min i max zmieniamy zgodnie z algorytmem. (19.) Na koniec każdej iteracji zwiększamy i o 2, ponieważ przechodzimy do kolejnej pary elementów.
(21.) Ostatni przypadek wykonujemy kiedy lista ma długość nieparzystą. (22., 23.) Porównujemy wtedy ostatni element z aktualnym minimum oraz maksimum.
Załóżmy, że początkowo naszym elementem minimalnym i maksymalny jest pierwszy element z listy. Następnie jeśli długość naszej listy jest nieparzysta to zaczynamy rozpatrywać kolejne pary od drugiego elementu. W przypadku parzystej długości zaczynamy od pierwszego elementu. Pomimo ustabilizowania ilości porównań złożoność algorytmu nie zmienia się i pozostaje liniowa.
(1.) Nagłówek funkcji pozostaje niezmieniony. (2.) Przyjmujemy, że minimum i maksimum to pierwszy element na liście. (4. - 13.) Pętla while jest identyczna jak w przypadku poprzedniej implementacji.
Obydwie wersje funkcji można przetestować poniższą funkcja main(). Po uruchomieniu wczyta od użytkownika długość listy n i wczyta n liczb. Następnie na konsolę zostanie wypisana wartość MIN oraz MAX.
Nową wersje funkcji testujemy funkcją main() z poprzedniej implementacji.
Przepisz algorytm, aby program wczytywał listę znaków. Elementem minimalnym ma być element, który występuje najbliżej a w alfabecie. Elementem maksymalnym będzie znak, który leży najdalej w alfabecie.
Przykładowo dla listy [z, h, b, x, k] program zwróci: