def alphabetize(arr, rev=false)
if rev
arr.sort { |item1, item2| item2 <=> item1 }
else
arr.sort { |item1, item2| item1 <=> item2 }
end
end
books = [“Heart of Darkness”, “Code Complete”, “The Lorax”, “The Prophet”, “Absalom, Absalom!”]
nie do konca rozumiem jak algortym sort idzie po tabeli?
jezeli tak jak each to zrozumeim ze to wyglada (dla wersji acsending)
index 0 <=> index 1
to co po kroku 1 jest na index 1 <=>index 2
to co po kroku 2 jest na index 2 <=>index 3
nie do konca rozumiem dlaczego to mialby poprawnie sorotwac cala tabele a nie tylko 2 porownywane elementy (bo jak rozumiem porwnania odbywaja sie kazdorazowo na parze elemnetow) przykladowo:
na tabel [6,3,1,2] tak jak ja to rozumiem, tak to zadziala (wiem ze blednie rozumiem bo wynik egzekucji programu jest poprawny):
wynik operacji <=> -1 tabl po operacji porownania [3,6,1,2]
Array#sort korzysta z algorytmu Quicksort*, blok który przekazujesz jest wykorzystywany przy porównywaniu elementów.
Algorytm, który opisałeś to bubble sort. W ten sposób też mógłbyś posortować elementy, ale musiałbyś przejść przez tablicę średnio n razy (gdzie n to liczba elementów w tablicy).
czyli tak naprawde zmienne z petli each to nie sa 2 nastepujace po sobie elemtny, tylko 2 elemnty kotre sa wybierane na pozimie implmentacji wewnetrznej algorytmu QS w miejscu w Ruby?
W uproszczeniu jest tak jak piszesz. Korzystając z pseudokodu z wikipedii:
function quicksort('array')
if length('array') ≤ 1
return 'array' // an array of zero or one elements is already sorted
select and remove a pivot value 'pivot' from 'array'
create empty lists 'less' and 'greater'
for each 'x' in 'array'
if 'x' ≤ 'pivot' then append 'x' to 'less'
else append 'x' to 'greater'
return concatenate(quicksort('less'), 'pivot', quicksort('greater')) // two recursive calls
Twój blok zostanie wykorzystany do przyrównania w miejscu gdzie teraz jest: if 'x' ≤ 'pivot'