Sortowanie szybkie - ogólna zasada działania

0

Dzień dobry, jeśli mamy dany następujący szereg liczb:

2 5 5 4 3 1 1

To w celu posortowania wybieramy liczbę w środku szeregu (pivot), oraz dwa wskaźniki, jeden na początku i drugi na końcu. Następnie sprawdzamy czy liczba pod wskaźnikiem lewym jest większa od pivota i jeśli tak, to sprawdzamy czy liczba pod wskaźnikiem prawym jest od pivota mniejsza. Jeśli tak to wtedy zamieniamy obie liczby, a jeśli nie to wskaźnik prawy cofamy o jedno oczko i znów porównujemy liczby. I tak do momentu gdy wskaźniki spotkają się w środku, i powtarzamy cała procedurę dla dwóch podszeregów rozdzielonych pivotem. Mój problem jest następujący, co jeśli, tak jak w podanym przeze mnie przypadku, ilość liczb nadających się do zamiany jest różna po obu stronach pivota ? Postępując zgodnie z w.w. instrukcją wykonamy następujące kroki:

2 5 5 4 3 1 **1 **
2 5 5 4 3 1 1 zamiana
2 1 5 4 3 1 5 zamiana
2 1 1 4 3 5 5 lewy wskaźnik doszedł już do pivota więc nie ma z czym wymieniać, a po prawej stronie wciąż jest liczba mniejsza od pivota.

0

Nie chce mi się analizować dokładnie jaki algorytm opisałeś, ale generalnie w sortowaniu szybkim do podziału problemu na dwie części (sortowanie szybkie to algorytm typu dziel-i-zwyciężaj) używa się albo Hoare Partition (prawie zawsze) albo Lomuto Partition (rzadko). Możesz je sobie obejrzeć np tutaj: http://cs.stackexchange.com/questions/11458/quicksort-partitioning-hoare-vs-lomuto i prześledzić sposób działania na kartce.

0

W najprostszej wersji idziesz wskaźnikami aż się spotkają, wtedy zamieniasz pivot z elementem pod tymi wskaźnikami. Czyli w Twoim przypadku oba wskaźniki się spotkają na 3 i wtedy zamieniasz 4 z 3.

1 użytkowników online, w tym zalogowanych: 0, gości: 1