Algorytm Sortowania Grawitacyjnego został opracowany na obserwacji naturalnego zjawiska w codziennym życiu. Jego działanie polega na zastosowaniu tego zjawiska w celu przyciąganie w dół większe liczby. Idea działania poprawnie jedynie dla liczb naturalnych. Każda liczba na liście jest początkowo zamieniana na kamyczki i ustawiana na takiej wysokości jaką ma pozycję w tablicy. Następnie w każdym słupku jest przeprowadzana symulacja opadania - w celu przyśpieszenia tego procesu należy zebrać wszystkie kamyczki w kolumnie i dostawić od dołu. Potem w celu odczytania liczb wystarczy sprawdzić ile kamyczków jest na danym poziomie.
Weźmy przykładowo tablicę L := {1, 7, 3, 4}. Pierwszy krok polega na rozrysowaniu schematu: dla i-tej liczby rysujemy na wysokości i w wierszu od lewej strony tyle kamyczków jaką wartość ma dana pozycja. Oto przykładowo wizualizacja:
Teraz należy przeprowadzic symulację opadania. W każdej kolumnie zliczamy ile znajduje się kamyczków. Wiadomo, że kamyczek nie opadnie jeśli bedzie pod nim inny kamyczek. Z tego powodu możliwe jest przestawienie k kamyczków w kolumnie na pierwsze k pozycji od dołu. Po przeprowadzeniu operacji opadania otrzymamy następujący obrazek:
Teraz pozostaje jedynie odczytać wartości liczb po posortowaniu. Jeśli chcemy, aby liczby zostały posortowane rosnąco to należy je odczytać od najwyższej wysokości do najniższej. W celu odczytania liczby w wierszu należy policzyć ile kamyczków się w niej znajduje.
Implementacja powyższego algorytmu w komputerze wymaga znalezienia maksymalnego elementu max na liście w czasie O(n2), zadeklarowania O(n·max) miejsca w pamięci. Algorytm będzie wykona dokładnie n z liczeń w każdej z max kolumn. Na koniec w podobnym czasie można odczytać wartości znajdujące się na liście. Podsumowując algorytm działa w czasie O(n·max) i jego złożoność pamięciowa wynosi O(n2).
Sortowanie danych należy rozpocząć od znalezienia największego elementu w tablicy. Dopiero na tej podstawie możliwe będzie utworzonie dwuwymiarowej tablicy - tutaj zostanie uproszczona do tablicy jednowymiarowej.
(2. - 5.) Znajdź maksimum i na tej podstawie (6.) zadeklaruj odpowiednio dużo pamięci. Potem (7. - 12.) do kolejnego wiersza zaznacz tyle pozycji ile ma kolejna liczba z tablicy. Na tej podstawie (13. - 21.) dla każdej kolumny zlicz ile jest zaznaczonych pozycji i przesuń do dołu. Na koniec (22. - 27.) odczytaj kolejne liczby po posortowaniu i przepisz do tablicy wejściowej.
Poniższy fragment kodu pozwala wczytać od użytkownika tablicę elementów do posortowania, a potem wypisać posortowaną tablicę.
Przedstawiona implementacja deklaruje zawsze tyle kolumn jaką wartość ma największy element na liście. Zapotrzebowanie na pamięć można poprawić poprzez znalezienie dodatkowo elementu najmniejszego. To pozwoli na ograniczenie ilości do minimum.
Napisz funkcję sortuj(), która skorzysta z przedstawionej wskazówki. Przetestuj napisane rozwiązanie.