Różne operacje wykonywane na komputerze mogą mieć różny koszt. W przypadku, gdy koszt zapisu jest bardzo duży, a trzeba posortować tablicę to warto wykonać tylko tyle operacji ile trzeba. W tym artykule zostanie wyjaśnione jak znaleźć ile potrzeba zamian, aby posortować tablicę liczb.
Napisany algorytm ma zwrócić liczbę potrzebnych zamian, aby dana tablica liczb całkowitych, dodatnich została posortowana. Liczby w tablicy się nie powtrzają. Zamieniać można dwa elementy leżące w dowolnych miejscach.
Weźmy jako przykład tablicę [3, 2, 1]. Do posortowania tej tablicy rosnąco potrzeba zaledwie jednej zamiany tj. elementu 1 i 3. Jeśli podany przypadek rozrysuje się jako graf można zauważyć, że strzałki tworzą cykl o długości 2.
Spróbujmy podobnie rozpisać dla tablicy [2, 3, 1, 5, 4]. W tym przypadku tworzą się dwa cykle, które można posortować oddzielnie.
Ile tym razem potrzeba zamian? Dokładnie 3. Wynika to z faktu, że lewą stronę można posortować w dwóch ruchach, a prawą w jednym. Zauważmy, że istnieje tutaj zależność pomiędzy długością cyklu, a ilością zamian: w celu posortowania cyklu długości n potrzeba n - 1 zamian. Oznacza to, że trzeba znaleźć wszystkie długości cykli i pomniejszyć o ilość cykli.
Poniższa funkcja IleZamian() zwraca dla podanej tablicy liczb ile minimalnie potrzeba zmian.
Na początku tworzymy pary (liczba × pozycja), a następnie sortujemy. Teraz znamy wszystkie krawędzie, który wystepują w grafie, ponieważ jeśli nowy pozycja jest różna od tej zapamiętanej to znaczy, że dana wartość musimy przesunąć. Jeśli wartości są takie same to znaczy, że nie istnieje potrzeba zamiany. Dla liczb, który trzeba zamienić uruchamiamy pętlę, która od pozycji i przechodzimy na pozycję z której dana liczba pochodzi. Kontynuując ten proces natrafimy z powrotem na pozycję z której wyszliśmy. Po drodze należy zliczyć ile takich przeskoków trzeba było wykonać, ponieważ jest to długość cyklu, którą pomniejszoną o 1 doliczamy do liczby zamian. Należy też pamiętać, aby oznaczać miejsca już odwiedzone, aby danego cyklu nie policzyć kilka razy. W tym algorytmie odwiedzona wartość zostaje zamieniona na -1.
W celu przetestowania kodu można skorzystać z poniższego kodu, który wczyta potrzebne dane i wypisze wynik: