Sortowanie Częstotliwościowe to takie sortowanie, które sortuje elementy analizując częstotliwość ich występowania. Oznacza to, że elementy o tej samej wartości o największej liczbie wystąpień znajdą się na początku listy. Istnieją różne metody rozwiązania przedstawionego problemu.
Najczęściej spotykana implementacja Sortowania Częstotliwościowego polega na policzeniu ile jest wystąpień każdego elementu. Oczywiście bardzo ważną sprawą jest to, aby przechowywać również informację o tym w jakiej kolejności kolejne elementy zostały odnalezione, ponieważ jeśli dwa różne elementy mają tyle samo wystąpień to powinny zachować kolejność z tablicy wejściowej. Tablicę przechowującą wartość każdego elementu i ilość wystąpień należy teraz posortować zgodnie z ilością wystąpień (tj. częstotliwością występowania elementu). Jednak w przypadku, gdy liczba wystąpień dwóch różnych elementów jest taka sama to należy posortować zgodnie z kolejnością ich wystąpowanie w tablicy wejściowej. Na koniec wystarczy odtworzyć tablicę na podstawie posortowanej tablicy.
Do posortowania jest następująca tablica L:={4, 3, 2, 2, 3, 1, 3, 1, 3}. Pierwszy etap polega na policzeniu ile jest wystąpień każdego elementu oraz zapamiętanie pierwszego wystąpienia każdego z elementu.
Element | Pierwsze Wystąpienie | Wystąpień |
---|---|---|
1 | 5 | 2 |
2 | 2 | 2 |
3 | 1 | 4 |
4 | 0 | 1 |
Dane na liście mogą być posortowane, ponieważ w dalszej części i tak zostaną odpowiednio ustawione dzięki przechowywaniu informacji o pierwszym wystąpieniu. Teraz całą tablicę należy posortować względem wystąpień.
Element | Pierwsze Wystąpienie | Wystąpień |
---|---|---|
3 | 1 | 4 |
2 | 2 | 2 |
1 | 5 | 2 |
4 | 0 | 1 |
Element 2 znalazł się przed elementem 1, ponieważ pierwszy wystąpił w tablicy wejściowej. Teraz pozostało odczytać wynik na podstawie utworzonej tablicy. Każdy kolejny element zostanie wpisany do tablicy zgodnie z tym ile razy występuje. Posortowana tablica wyjściowa to L':={3, 3, 3, 3, 2, 2, 1, 1, 4}.
Napisz program, który posortuje elementy malejąco względem częstotliwości ich występowania. Elementy o tej samej ilości wystąpień powinny zostać posortowane według indeksu peirwszego wystąpienia elementu. Przetestuj działanie napisanego programu.
Ze względu na to, że dane najpierw są analizowane i każdy element wymaga przechowania kilku informacji to została napisana specjalna strruktura Element, która pozwala na przechowanie jako obiekt (2.) klucza, (3.) ilości wystąpień oraz (4.) indeks pierwszego wystąpienia.
Do sortowania danych będących podsumowaniem analizowanej tablicy zostanie wykorzystane sortowanie wbudowane w język programowania. Jednak wymaga to zdefiniowania odpowiedniego fragmentu kodu, który porówna dwa elementy. Poniższa funkcja porownaj() zwraca, który element a czy b jest większy.
Teraz można przejść do pisania właściwego kodu sortowania. Na początku należy (2.) utworzyć listę do przechowywania podsumowania, a następnie (4. - 17.) utworzyć podsumowanie.
W celu utworzenia podsumowania należy: (6. - 7.) sprawdzić czy istnieje już wpis dla i-tej wartości. Jeśli nie to (8. - 14.) należy dodać taki wpis, a potem (16.) zwiększyć ilość wystąpień danego elementu. Dalsza część kodu polega na (18.) posortowaniu danych i (19. - 23.) ich następnym przepisaniu.
W celu przetestowania napisanej funkcji sortującej można skorzystać z poniższego fragmentu kodu:
Napisz funkcję, która do sortowania będzie przechowywać jedynie parę wartości: indeks oraz ilość wystąpień. Ponadto tym razem elementy powinny zostać posortowane według częstotliwości w sposób rosnący. W przypadku, gdy dwa elementy mają tyle samo wystąpień to o ich kolejności powinno zadecydować ostatnie ich wystąpienie.
Przykładowo tablica L:={4, 3, 2, 2, 3, 1, 3, 1, 3} powinna zostać posortowana następująco:
Najpierw należy zbudować odpowiednią tablicę wartości:
Klucz | Ostatnie Wystąpienie | Wystąpień |
---|---|---|
1 | 7 | 2 |
2 | 3 | 2 |
3 | 8 | 4 |
4 | 0 | 1 |
Zgodnie z zadaniem klucz nie powinien być przechowywany przez program. Następne posortowanie daje następujący wynik:
Element | Pierwsze Wystąpienie | Wystąpień |
---|---|---|
4 | 0 | 1 |
2 | 3 | 2 |
1 | 7 | 2 |
3 | 8 | 4 |
Na tej podstawie można wygenerować tablice końcową L':={4, 2, 2, 1, 1, 3, 3, 3, 3}.