Program w języku C++ krok po kroku
Algorytm sortowania szybkiego – implementacja w języku C++
Aby skonstruować algorytm sortowania szybkiego, możemy napisać dwie funkcje, w tym jedną wywoływaną rekurencyjnierekurencyjnie. Wykonujemy w tym celu następujące kroki:
Tworzymy nagłówek funkcji, w którym zapisujemy typ zwracanej wartości (w tym przypadku funkcja nic nie zwraca, zatem podajemy typ
void), nazwę funkcjiquicksort, oraz w okrągłych nawiasach podajemy argumenty, jakie funkcja przyjmuje.Zapisujemy warunek sprawdzany w funkcji. Sprawdzamy, czy
IndeksPoczatkowyjest mniejszy odIndeksKoncowy. Gdyby tak nie było, rozmiar tablicy byłby ujemny bądź równy 0, zatem nie byłoby możliwe operowanie na nieistniejącej tablicy.W przypadku, gdy tablica istnieje, deklarujemy zmienną
arówną zwracanej wartości przez funkcjęPodzielTablice(). Następnie rekurencyjnie wywołujemy funkcjęquicksortdla dwóch oddzielnych części tablicy: pierwszy raz dla części od początku tablicy do wartości zmiennejapomniejszonej o 1, zaś drugi dla części tablicy od wartości zmiennejapowiększonej o 1 do końca tablicy.
Po wykonaniu tych kroków uzyskujemy kod, który prezentuje się następująco:
Następnie tworzymy funkcję PodzielTablice(), która będzie odpowiedzialna za posortowanie tablicy w taki sposób, aby liczba pivot była na środku, liczby od niej mniejsze po jej lewej stronie, a większe – po prawej. W tym celu musimy wykonać następujące kroki:
Tworzymy nagłówek funkcji, w którym zapisujemy typ zwracanej zmiennej (
int), nazwę funkcji, a następnie w nawiasach okrągłych jej argumenty:
int tab[] – tablica, na której będziemy wykonywać operacje int IndeksPoczatkowy, int IndeksKoncowy
Deklarujemy zmienną
int pivotrówną liczbie zapisanej pod indeksem końcowym w tablicytab[].
Deklarujemy zmienną
int IndeksMniejszegoElementurównąIndeksPoczatkowy - 1.
Tworzymy pętlę
forwykonującą się o jeden raz mniej, niż wynosi różnica indeksów: końcowy minus początkowy.
W pętli sprawdzamy warunek, czy aktualnie badana liczba jest mniejsza od liczby
pivot.
Jeśli tak jest, zwiększamy
IndeksMniejszegoElementuo jeden oraz zamieniamy miejscami liczby pod indeksami o wartościachIndeksuMniejszegoElementuoraz obecnie sprawdzanego elementu, czylij.
Po wyjściu z pętli zamieniamy miejscami elementy o indeksach
IndeksMniejszegoElementu + 1orazIndeksKoncowy(czyli liczbępivot).
Zamiast zastosowania funkcji swap(), która zamienia wartości dwóch obiektów będących argumentami, można to zrealizować z wykorzystaniem zmiennej pomocniczej. Warto o tym pamiętać, ponieważ często na egzaminie maturalnym korzystanie z takich funkcji jest zakazane.
Spróbuj wprowadzić w kodzie poprawkę tak, by funkcja była zbędna.
Na końcu zwracamy
IndeksMniejszegoElementu + 1
Po poprawnym wykonaniu przedstawionych kroków uzyskujemy następujący kod:
Zapoznajmy się całym kodem programu, który ma posortować niemalejąco tablicę danych tab zawierającą n liczb naturalnych.
Specyfikacja problemu:
Dane:
n– liczba naturalna; liczba elementów tablicytabtab–n-elementowa tablica liczb naturalnych
Wynik:
tab–n-elementowa tablica liczb naturalnych posortowana niemalejąco
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