W celu znalezienia k-tej największej wartości wystarczy posortować dane i wybrać k-ty element. Jednak często zapisana lista i tak nie zostanie zapisana, więc można zastosować bardziej optymalny algorytm.
W celu optymalizacji wyszukiwania k-tego elementu można pominąć sortowanie tablicy. Algorytm polega na utworzeniu k elementowej tablicy pomocniczej do której będą dopisywane kolejne elementy z tablicy głównej. W tablicy pomocniczej elementy będą zawsze posortowane malejąco, więc po przejrzeniu całej tablicy wystarczy zwrócić ostatni element.
Oszczędność tutaj dotyczy zasobów. Niektóre z algorytmów sortowania wymagają dodatkowej tablicy tej samej długości co tablica główna. W tym przypadku potrzeba zaledwie O(k) dodatkowej pamięci. Dodatkowym atutem algorytmu jest fakt, że w trakcie wyszukiwania można wykluczyć powtarzające się wystąpienia tych samych elementów.
Weźmy na początek tablice L := {5, 2, 4, 1, 3}. Szukamy drugiego największego elementu, więc tymczasowa tablica będzie składać się z dwóch miejsc. Wybierając kolejne elementy otrzymujemy:
Element listy | Lista Tymczasowa | Komentarz |
---|---|---|
5 | {_, _} | Dodaj na pierwsze miejsce tablicy tymczasowej |
2 | {5, _} | 2 jest mniejsze niż 5 dopisz na drugie miejsce tablicy |
4 | {5, 2} | 4 < 5 i 4 > 2, więc wstawiamy 4 przed 2, ponieważ tablica ma maksymalną długość dwa to usuwamy element 2 |
1 | {5, 4} | 1 jest mniejsze od 5 i 4, więc nie wstawiamy do tablicy |
3 | {5, 4} | podobnie jak z 1, 3 nie jest większe od jakiegokolwiek elementu na liście |
Ostateczna tablica tymczasowa to {5, 4}. Po wykonaniu wszystkich instrukcji otrzymujemy, że drugim największym elementem na liście jest 4, ponieważ jest to ostatni element w tablicy tymczasowej.
Weźmy na początek tablice L := {1, 2, 3, 2, 1, 4}. Ponownie szukamy trzeciego największego elementu. Tym razem na liście są dwa elementy występujące dwa razy. Oznacza to, że drugie wystąpienia danego elementu nie będziemy uwzględniać w celu wstawienia do tablicy
Element listy | Lista Tymczasowa | Komentarz |
---|---|---|
1 | {_, _, _} | Dodaj na pierwsze miejsce tablicy tymczasowej |
2 | {1, _, _} | wstaw 2 na pierwszą pozycję przesuwając 1 w prawo |
3 | {2, 1, _} | wstaw 3 na pierwszą pozycję |
2 | {3, 2, 1} | 2 występuje w tablicy, więc nie dopisuj |
1 | {3, 2, 1} | 1 występuje w tablicy, więc nie dopisuj |
4 | {3, 2, 1} | wstaw 4 na pierwszej pozycji i przesuń pozostałe |
Ostateczna lista tymczasowa to {4, 3, 2}, więc trzecim największym elementem jest 2.
Wstawiając element do tablicy tymczasowej trzeba znać pozycję na którą go wstawić. Funkcja podajPozycje() przyjmuje trzy argumenty: wartosc - wartość, którą chcemy wstawić, lista - lista w której szukamy pozycji oraz dl jej długość. Wynikiem działania funkcji jest pozycja na której element powinien zostać wstawiony, aby lista dalej była posortowana. Jeśli element nie pasuje do tablicy to zwrócona zostanie długość tablicy.
Funkcja wyszukująca k-ty największy element wymaga podania trzech argumentów: k - który kolejny element z lista - lista elementów, która ma długość n.
Na początku działania funkcji (2.) tworzona jest tymczasowa tablica na przechowanie kolejnych elementów. Domyślnie (3. - 4.) każde pole ma zainicjowaną wartość na minimalną wartość zmiennej typu int. Potem (5.) dla każdego elementu z listy: (6.) szukamy gdzie dany element by trafił. (7.) Zanim go wstawiamy to sprawdzamy czy pasuje do tablicy oraz czy na znalezionym miejscu nie znajduje się identyczna wartość. Jeśli warunki są spełnione to (8. - 9.) przesuwamy wartości na prawo od miejsca gdzie wstawiamy i (10.) wstawiamy element. (13.) Na koniec zwracamy ostatni element tablicy.
W celu przetestowania działania funkcji wystarczy przedstawiony poniżej kod. Poprosi on użytkownika o wprowadzenie danych i zinterpretuje wynik zwrócony przez funkcje.
Napisz funkcję kNamniejszaWartosc(), która poda k-ty najmniejszy na liście lista o n elementach. Przetestuj napisany kod.