Implementacja algorytmu
Implementacja algorytmu w języku Python
Algorytm sortowania szybkiego bazuje na dwóch funkcjach. Są to:
Funkcja odpowiadająca za podział tablicy – wartością zwracaną przez funkcję będzie indeks miejsca podziału tablicy (indeks pivota). W naszym programie funkcja przyjmie nazwę
podziel_tablice. Parametry tej funkcji będą identyczne jak w przypadku funkcjisortowanie_szybkie.Funkcja wywoływana rekurencyjnie – nazwiemy ją
sortowanie_szybkie. Funkcja ta będzie przyjmowała trzy parametry:tab– tablica zawierająca liczby całkowite do posortowania,indeks_poczatkowy– indeks elementu początkowego fragmentu tablicy, od którego chcemy rozpocząć sortowanie tablicy,indeks_koncowy– indeks końcowego elementu fragmentu tablicy, na którym chcemy zakończyć sortowanie tablicy.
Oto obie zadeklarowane funkcje:
Zacznijmy od wypełnienia bloku funkcji sortowanie_szybkie. W instrukcji warunkowej sprawdzamy, czy podana jako argument tablica składa się z więcej niż jednego elementu. Jeżeli tak, następuje wywołanie funkcji podziału tablicy – podziel_tablice. Do zmiennej indeks_podzialu zostanie zapisany punkt podziału tablicy (określony przez funkcję podziel_tablice).
Po wywołaniu funkcji podziału następują dwa wywołania rekurencyjne funkcji sortowanie_szybkie():
sortowanie_szybkie(tab, indeks_poczatkowy, indeks_podzialu - 1);
– dla pierwszej (lewej) części tablicy,sortowanie_szybkie(tab, indeks_podzialu + 1, indeks_koncowy);
– dla drugiej (prawej) części tablicy.
Oto cały blok funkcji sortowanie_szybkie():
Kolejnym krokiem będzie przygotowanie funkcji podziel_tablice.
Tworzymy zmienną pivot, do której zapisujemy wartość ostatniego elementu z sortowanego zakresu tablicy.
Następnym krokiem jest utworzenie zmiennej indeks_elementu_mniejszego_od_pivota, której ustawiamy wartość o 1 mniejszą od tej zapisanej w zmiennej indeks_poczatkowy. Będzie to iterator, spełniający dwa ważne zadania. Po pierwsze będzie wskazywał, na którą pozycję mamy przenieść element, gdy okaże się on mniejszy od pivota. Po drugie pomoże ustalić, w którym miejscu znajdują się elementy mniejsze od pivota. Tę zmienną wykorzystamy przy kolejnych podziałach tablicy.
Tworzymy pętlę for. Dla czytelności iterator sterujący pętlą określimy jako indeks_poszukujacy. Jego zadaniem będzie przejście po wszystkich elementach tablicy tab, które znajdują się w zadanym zakresie.
Wewnątrz pętli tworzymy instrukcję warunkową. Jeżeli wartość elementu tab[indeks_poszukujacy] jest mniejsza od wartości pivot, przenosimy ją na lewą stronę. Zwiększamy indeks_elementu_mniejszego_od_pivota i zamieniamy miejscami element znajdujący się w tablicy tab[indeks_elementu_mniejszego_od_pivot] z elementem tab[indeks_poszukujacy]. Pamiętajmy, że operacja ta jest powtarzana dla każdej komórki w tablicy, której indeks znajduje się w przedziale <indeks_poczatkowy, indeks_koncowy>.
Po przejściu pętli porządkujemy pivota – zamieniamy go miejscami z elementem wskazywanym przez indeks_elementu_mniejszego_od_pivota + 1.
Funkcję kończymy, zwracając indeks wskazujący na miejsce podziału: indeks_elementu_mniejszego_od_pivota + 1.
Utworzymy tablicę z liczbami całkowitymi, a następnie wywołamy funkcję sortowanie_szybkie w celu posortowania elementów. Wypiszemy też elementy tablicy przed sortowaniem i po sortowaniu, żeby zobaczyć, czy zostało ono wykonane poprawnie.
Oto pełen kod programu:
W języku Python istnieje wbudowana funkcja sorted(list) lub metoda list.sort(), która działa w oparciu o zmodyfikowany algorytm timesort. Więcej o sortowaniu w języku Python można znaleźć na stronie Sorting HOW TO.
Słownik
element osiowy – element tablicy wybrany wedle ustalonego schematu; jest to element odpowiadający za sposób dzielenia tablicy
proces polegający na wywoływaniu funkcji przez siebie samą do momentu rozwiązania określonego problemu
sytuacja, w której funkcja wywołuje samą siebie
zasada często stosowana przez programistów przy tworzeniu algorytmów opartych o rekurencję, polegająca na tym, że jeden trudny, złożony problem dzielony jest na kilka mniejszych, prostszych do rozwiązania
ilość czasu potrzebnego do wykonania zadania, wyrażona jako funkcja ilości danych
złożoność czasowa i złożoność pamięciowa; ilość zasobów komputerowych potrzebnych do wykonania zadania