W poprzedniej sekcji zaprezentowano, na czym polega sortowanie pozycyjne oraz jak przebiega jego implementacja w języku Java. W tej sekcji pokażemy, że nie zawsze algorytmem pomocniczym jest sortowanie przez zliczanie.  Zaimplementujemy algorytm sortowania pozycyjnego, używając pomocniczo sortowania bąbelkowego. Pamiętajmy jednak, że możemy wykorzystać dowolny stabilny algorytm sortujący, np. sortowanie przez wstawianie lub sortowanie przez scalanie.

Algorytm sortowania pozycyjnego w języku Java

Zacznijmy od stworzenia funkcji, która będzie przechowywała tablicę zawierającą łańcuchy znaków – będą to przykładowe słowa.

Linia 1. prawy ukośnik prawy ukośnik funkcja sortowania pozycyjnego. Linia 2. static void sortowaniePozycyjneSlow otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy slowa zamknij nawias okrągły otwórz nawias klamrowy. Linia 4. zamknij nawias klamrowy.

Ponieważ sortowane słowa mogą być różnej długości, zanim przystąpimy do właściwej implementacji algorytmu, znajdziemy najdłuższe słowo. W tym celu zapiszemy długość pierwszego słowa do zmiennej maxDlugosc. Następnie w pętli będziemy porównywali długości kolejnych słów ze zmienną maxDlugosc. Jeżeli sprawdzane słowo okaże się dłuższe, zmienimy wartość zmiennej maxDlugosc na długość obecnie sprawdzanego słowa. Pamiętajmy, że interesuje nas tylko długość najdłuższego słowa, a nie to, które słowo jest najdłuższe – dlatego wystarczy tylko jedna zmienna.

Linia 1. prawy ukośnik prawy ukośnik funkcja sortowania pozycyjnego. Linia 2. static void sortowaniePozycyjneSlow otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy slowa zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. prawy ukośnik prawy ukośnik znajdujemy najdłuższe słowo w tablicy. Linia 4. int maxDlugosc znak równości slowa otwórz nawias kwadratowy 0 zamknij nawias kwadratowy kropka length otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 5. for otwórz nawias okrągły int i znak równości 1 średnik i otwórz nawias ostrokątny slowa kropka length minus 1 średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. if otwórz nawias okrągły slowa otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias ostrokątny maxDlugosc zamknij nawias okrągły otwórz nawias klamrowy. Linia 7. maxDlugosc znak równości slowa otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka length otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 8. zamknij nawias klamrowy. Linia 9. zamknij nawias klamrowy. Linia 10. zamknij nawias klamrowy.

Teraz możemy napisać właściwy algorytm sortowania pozycyjnego. W pętli for będziemy wywoływać funkcję sortującą – w tym przypadku będzie to funkcja sortowanieBabelkowe. Funkcja ta będzie zawierać pomocniczy stabilny algorytm sortowania. Wykonywanie pętli rozpocznie się od znaku o indeksie maxDlugosc - 1, a zakończy na indeksie 0.

Linia 1. prawy ukośnik prawy ukośnik funkcja sortowania pozycyjnego. Linia 2. static void sortowaniePozycyjneSlow otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy slowa zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. prawy ukośnik prawy ukośnik znajdujemy najdłuższe słowo w tablicy. Linia 4. int maxDlugosc znak równości slowa otwórz nawias kwadratowy 0 zamknij nawias kwadratowy kropka length otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 5. for otwórz nawias okrągły int i znak równości 1 średnik i otwórz nawias ostrokątny slowa kropka length minus 1 średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. if otwórz nawias okrągły slowa otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias ostrokątny maxDlugosc zamknij nawias okrągły otwórz nawias klamrowy. Linia 7. maxDlugosc znak równości slowa otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka length otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 8. zamknij nawias klamrowy. Linia 9. zamknij nawias klamrowy. Linia 11. prawy ukośnik prawy ukośnik sortujemy dla każdej kolejnej pozycji. Linia 12. for otwórz nawias okrągły int i znak równości maxDlugosc minus 1 średnik i zamknij nawias ostrokątny znak równości 0 średnik i minus minus zamknij nawias okrągły otwórz nawias klamrowy. Linia 13. sortowanieBabelkowe otwórz nawias okrągły slowa przecinek i zamknij nawias okrągły średnik. Linia 14. zamknij nawias klamrowy. Linia 15. zamknij nawias klamrowy.

Przykładowy algorytm pomocniczy – sortowanie bąbelkowe

Po przygotowaniu pierwszej funkcji – wskazującej, po którym znaku będziemy układać elementy w tym wywołaniu, wybieramy stabilny algorytm sortowania i przechodzimy do implementacji algorytmu sortowania wewnętrznego. Funkcja realizująca ten algorytm będzie przyjmować dwa argumenty: jednowymiarową tablicę znaków slowa oraz liczbę całkowitą indeksZnaku. Pamiętajmy, że algorytm w niej zawarty musi być stabilnystabilny algorytm sortowaniastabilny.

Algorytmem sortowania, który spełnia nasze wymagania jest między innymi sortowanie bąbelkowe.

Opis tego algorytmu możesz znaleźć w odpowiednim e‑materiale. W tej sekcji potrzebujemy wprowadzić jedynie odpowiednią modyfikację, która zapobiegnie wyświetlaniu błędów w sytuacji, gdy sortowane słowa są różnej długości.

Linia 1. static void sortowanieBabelkowe otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy slowa przecinek int indeksZnaku zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. zamknij nawias klamrowy.

Zapiszmy w zmiennej n długość tablicy slowa.

Linia 1. static void sortowanieBabelkowe otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy slowa przecinek int indeksZnaku zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. int n znak równości slowa kropka length średnik. Linia 3. zamknij nawias klamrowy.

Stwórzmy również dwie pętle. Pierwsza z nich w każdym swoim obiegu umieści na odpowiednim miejscu jeden z elementów. Druga pętla, wewnętrzna, będzie odpowiedzialna za porównywanie elementów i ich zamianę.

Linia 1. static void sortowanieBabelkowe otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy slowa przecinek int indeksZnaku zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. int n znak równości slowa kropka length średnik. Linia 3. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n minus 1 średnik i plus plus zamknij nawias okrągły. Linia 4. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny n minus i minus 1 średnik j plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. zamknij nawias klamrowy. Linia 7. zamknij nawias klamrowy.

Teraz wprowadzamy instrukcję warunkową, której nie ma w oryginalnym algorytmie. Sprawdzamy, czy słowa które porównujemy, mają na pozycji indeksZnaku jakikolwiek znak. Jeżeli nie mają (ponieważ np. są za krótkie), to porównywanie ich liter o danym indeksie jest bezcelowe.

Linia 1. static void sortowanieBabelkowe otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy slowa przecinek int indeksZnaku zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. int n znak równości slowa kropka length średnik. Linia 3. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n minus 1 średnik i plus plus zamknij nawias okrągły. Linia 4. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny n minus i minus 1 średnik j plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. if otwórz nawias okrągły slowa otwórz nawias kwadratowy j zamknij nawias kwadratowy kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias ostrokątny indeksZnaku ampersant ampersant slowa otwórz nawias kwadratowy j plus 1 zamknij nawias kwadratowy kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias ostrokątny indeksZnaku zamknij nawias okrągły otwórz nawias klamrowy. Linia 7. zamknij nawias klamrowy. Linia 8. zamknij nawias klamrowy. Linia 9. zamknij nawias klamrowy. Linia 10. zamknij nawias klamrowy.

Zapisujemy instrukcje, które wykonają się, jeśli zostanie spełniony warunek zapisany w linii 5. Zadaniem tych instrukcji jest zamiana miejscami porównywanych elementów.

Linia 1. static void sortowanieBabelkowe otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy slowa przecinek int indeksZnaku zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. int n znak równości slowa kropka length średnik. Linia 3. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n minus 1 średnik i plus plus zamknij nawias okrągły. Linia 4. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny n minus i minus 1 średnik j plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. if otwórz nawias okrągły slowa otwórz nawias kwadratowy j zamknij nawias kwadratowy kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias ostrokątny indeksZnaku ampersant ampersant slowa otwórz nawias kwadratowy j plus 1 zamknij nawias kwadratowy kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias ostrokątny indeksZnaku zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. if otwórz nawias okrągły slowa otwórz nawias kwadratowy j zamknij nawias kwadratowy kropka charAt otwórz nawias okrągły indeksZnaku zamknij nawias okrągły zamknij nawias ostrokątny slowa otwórz nawias kwadratowy j plus 1 zamknij nawias kwadratowy kropka charAt otwórz nawias okrągły indeksZnaku zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 7. String pom znak równości slowa otwórz nawias kwadratowy j zamknij nawias kwadratowy średnik. Linia 8. slowa otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości slowa otwórz nawias kwadratowy j plus 1 zamknij nawias kwadratowy średnik. Linia 9. slowa otwórz nawias kwadratowy j plus 1 zamknij nawias kwadratowy znak równości pom średnik. Linia 10. zamknij nawias klamrowy. Linia 11. zamknij nawias klamrowy. Linia 12. zamknij nawias klamrowy. Linia 13. zamknij nawias klamrowy.

Mamy gotowy stabilny algorytm sortowania oraz algorytm sortowania pozycyjnego. Możemy teraz wywołać program dla przykładowych danych:

Linia 1. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. String otwórz nawias kwadratowy zamknij nawias kwadratowy slowa znak równości otwórz nawias klamrowy. Linia 3. cudzysłów ziemniak cudzysłów przecinek. Linia 4. cudzysłów kartofel cudzysłów przecinek. Linia 5. cudzysłów pyra cudzysłów przecinek. Linia 6. cudzysłów pomidor cudzysłów przecinek. Linia 7. cudzysłów melon cudzysłów przecinek. Linia 8. cudzysłów marchewka cudzysłów przecinek. Linia 9. cudzysłów papryka cudzysłów przecinek. Linia 10. cudzysłów arbuz cudzysłów przecinek. Linia 11. cudzysłów ananas cudzysłów przecinek. Linia 12. cudzysłów cebula cudzysłów przecinek. Linia 13. cudzysłów czosnek cudzysłów. Linia 14. zamknij nawias klamrowy średnik. Linia 16. sortowaniePozycyjneSlow otwórz nawias okrągły slowa zamknij nawias okrągły średnik. Linia 17. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny slowa kropka length średnik i plus plus zamknij nawias okrągły. Linia 18. System kropka out kropka println otwórz nawias okrągły slowa otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły średnik. Linia 19. zamknij nawias klamrowy.

Na wyjściu otrzymamy zatem:

Linia 1. ananas. Linia 2. arbuz. Linia 3. cebula. Linia 4. czosnek. Linia 5. kartofel. Linia 6. marchewka. Linia 7. melon. Linia 8. papryka. Linia 9. pomidor. Linia 10. pyra. Linia 11. ziemniak.

Cały kod programu:

Linia 1. import java kropka util kropka Arrays średnik. Linia 3. public class SortowaniePozycyjneSlow otwórz nawias klamrowy. Linia 5. static void sortowaniePozycyjneSlow otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy slowa zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. int maxDlugosc znak równości slowa otwórz nawias kwadratowy 0 zamknij nawias kwadratowy kropka length otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 7. for otwórz nawias okrągły int i znak równości 1 średnik i otwórz nawias ostrokątny slowa kropka length minus 1 średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 8. if otwórz nawias okrągły slowa otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias ostrokątny maxDlugosc zamknij nawias okrągły otwórz nawias klamrowy. Linia 9. maxDlugosc znak równości slowa otwórz nawias kwadratowy i zamknij nawias kwadratowy kropka length otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 10. zamknij nawias klamrowy. Linia 11. zamknij nawias klamrowy. Linia 13. for otwórz nawias okrągły int i znak równości maxDlugosc minus 1 średnik i zamknij nawias ostrokątny znak równości 0 średnik i minus minus zamknij nawias okrągły otwórz nawias klamrowy. Linia 14. sortowanieBabelkowe otwórz nawias okrągły slowa przecinek i zamknij nawias okrągły średnik. Linia 15. zamknij nawias klamrowy. Linia 17. zamknij nawias klamrowy. Linia 19. static void sortowanieBabelkowe otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy slowa przecinek int indeksZnaku zamknij nawias okrągły otwórz nawias klamrowy. Linia 20. int n znak równości slowa kropka length średnik. Linia 21. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny n minus 1 średnik i plus plus zamknij nawias okrągły. Linia 22. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny n minus i minus 1 średnik j plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 23. if otwórz nawias okrągły slowa otwórz nawias kwadratowy j zamknij nawias kwadratowy kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias ostrokątny indeksZnaku ampersant ampersant slowa otwórz nawias kwadratowy j plus 1 zamknij nawias kwadratowy kropka length otwórz nawias okrągły zamknij nawias okrągły zamknij nawias ostrokątny indeksZnaku zamknij nawias okrągły otwórz nawias klamrowy. Linia 24. if otwórz nawias okrągły slowa otwórz nawias kwadratowy j zamknij nawias kwadratowy kropka charAt otwórz nawias okrągły indeksZnaku zamknij nawias okrągły zamknij nawias ostrokątny slowa otwórz nawias kwadratowy j plus 1 zamknij nawias kwadratowy kropka charAt otwórz nawias okrągły indeksZnaku zamknij nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 25. String pom znak równości slowa otwórz nawias kwadratowy j zamknij nawias kwadratowy średnik. Linia 26. slowa otwórz nawias kwadratowy j zamknij nawias kwadratowy znak równości slowa otwórz nawias kwadratowy j plus 1 zamknij nawias kwadratowy średnik. Linia 27. slowa otwórz nawias kwadratowy j plus 1 zamknij nawias kwadratowy znak równości pom średnik. Linia 28. zamknij nawias klamrowy. Linia 29. zamknij nawias klamrowy. Linia 30. zamknij nawias klamrowy. Linia 32. zamknij nawias klamrowy. Linia 34. public static void main otwórz nawias okrągły String otwórz nawias kwadratowy zamknij nawias kwadratowy args zamknij nawias okrągły otwórz nawias klamrowy. Linia 35. String otwórz nawias kwadratowy zamknij nawias kwadratowy slowa znak równości otwórz nawias klamrowy. Linia 36. cudzysłów ziemniak cudzysłów przecinek. Linia 37. cudzysłów kartofel cudzysłów przecinek. Linia 38. cudzysłów pyra cudzysłów przecinek. Linia 39. cudzysłów pomidor cudzysłów przecinek. Linia 40. cudzysłów melon cudzysłów przecinek. Linia 41. cudzysłów marchewka cudzysłów przecinek. Linia 42. cudzysłów papryka cudzysłów przecinek. Linia 43. cudzysłów arbuz cudzysłów przecinek. Linia 44. cudzysłów ananas cudzysłów przecinek. Linia 45. cudzysłów cebula cudzysłów przecinek. Linia 46. cudzysłów czosnek cudzysłów. Linia 47. zamknij nawias klamrowy średnik. Linia 49. sortowaniePozycyjneSlow otwórz nawias okrągły slowa zamknij nawias okrągły średnik. Linia 50. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny slowa kropka length średnik i plus plus zamknij nawias okrągły. Linia 51. System kropka out kropka println otwórz nawias okrągły slowa otwórz nawias kwadratowy i zamknij nawias kwadratowy zamknij nawias okrągły średnik. Linia 52. zamknij nawias klamrowy. Linia 53. zamknij nawias klamrowy.

Słownik

porządek leksykograficzny
porządek leksykograficzny

sposób porządkowania elementów zbioru, analogiczny do kolejności alfabetycznej

stabilny algorytm sortowania
stabilny algorytm sortowania

algorytm, który dla dwóch równych elementów w zbiorze danych wejściowych zachowuje ich kolejność