Sortowanie danych


#1

Witam wszystkich :slight_smile:
Mam problem ze zrozumieniem 2 ostatnich linijek algorytmu sortowania szybkiego, którego znalazłem. Oto link: https://ideone.com/3OpEnn. Wiem, że chodzi o dalszą rekurencję. Jednak dlaczego nie możemy skorzystać z samych liter “i” i “j”, tylko dodatkowo dopisywać wyrazy “left” i “right”?
Pozdrawiam.


#2

W tym temacie jestem laikiem, ale zmienne całkowite “left” i “right” to - z tego, co widzę - pierwotne wartości “i” oraz “j”. Równie dobrze możnaby nazwać te zmienne “i_origin” / “j_origin”. Ostatnie linijki wykorzystują po 3 parametry, zarówno zmodyfikowaną wartość “i” / “j”, jak i wartości zdefiniowane na początku.

O to ci może chodzi? :slight_smile:


#3

Zmień myślenie. To nie litery i wyrazy tylko zmienne. Left i right to zmienne (parametry) wejściowe funkcji. Słyszałeś kiedyś na matematyce o y = f(x) ? Tak samo i w programowaniu funkcje mają swoje wejście i wyjście (z wyjątkiem funkcji bez parametrów wejściowych i/lub typu void).
Parametry wejściowe nie powinny być nigdy modyfikowane (różne języki pozwalają jednak na takie lub inne zachowanie się tych parametrów), Twoje ‘litery’ ‘i’ oraz ‘j’ to z kolei zmienne lokalne dla funkcji, to na nich robione są właściwe obliczenia.
Pod koniec kodu funkcji potrzebujesz zarówno wartości wejściowych (left, right) jak i wartości wejściowych odpowiednio zmodyfikowanych (i, j).

Zrozumienie istoty działania samego algorytmu pozostawiam tobie - jest to rzecz elementarna.


#4

W tym przypadku nie posyłamy oryginałów zmiennych, tylko tworzymy na potrzebę funkcji zmienne left oraz right, dlatego modyfikacja ich nie miała by większego wpływu. Jednak potrzebne jest pozostawienie tych zmiennych w postaci pierwotnej i stworzyć dodatkowo zmienne pomocnicze i oraz j do modyfikacji, później wywołania rekurencji?


#5

To wiem, jednak nie mogę zrozumieć dlaczego w dwóch ostatnich linijkach kodu potrzeba użyć naprzemiennie i,j oraz left,right.


#6

Weź to jakoś bardziej po polsku napisz, bo kompletnie nie rozumiem o co ci teraz chodzi.

Może zacznij od jakiegoś prostszego algorytmu, nie koniecznie opartego o rekurencję, bo ta bywa ciężka do zrozumienia dla (bardzo) początkujących.


#7

Chodzi mi o to, że gdy są to kopie zmiennych z funkcji main(), a nie oryginały to modyfikacja ich nie ma większego znaczenia.

Nie musisz być, aż tak złośliwy, spokojnie :stuck_out_tongue:

Pomimo tego, dzięki za wskazówki. Spróbuję to rozwiązać


#8

A czemu nie ma znaczenia? Pomijając fakt, że możliwość ich modyfikowania jest ‘language-specific’ to ich modyfikacja jest moim zdaniem złym nawykiem. Przy dużej liczbie kodu w programie nie będziesz pamiętał pojedynczych funkcji ani ich działania, zmiana parametru wejściowego funkcji może być bardzo myląca podczas debugowania.

Gdybym chciał być złośliwy to prawdopodobnie nie miał byś ochoty więcej do mnie pisać. Jesteś początkujący - to nie złośliwość a fakt. Rekurencja nie jest ‘kompatybilna’ z normalnym, ludzkim tokiem myślenia, który jest liniowy. Zanim się przestawisz, zanim doznasz informatycznego objawienia, które ten tok myślenia na zawsze odmieni to jeszcze trochę czasu minie :wink: A i samej wiedzy musisz jeszcze dużo ‘wchłonąć’.


#9

Dziękuję Tobie bardzo za pomoc. Potrzeba więcej takich ludzie jak Ty, którzy pomogą słabszym w danej dziedzinie. Muszę jeszcze wiele się nauczyć i przeznaczyć więcej czasu na analizę i naukę, aby zrozumieć trudniejsze zagadnienia :slight_smile: