Prosba o wytlumaczenie jak algorytm sort przechodzi przez tabele

przykładowy kod (z kursu codecademy.com)

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)

  1. index 0 <=> index 1
  2. to co po kroku 1 jest na index 1 <=>index 2
  3. 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):

  1. wynik operacji <=> -1 tabl po operacji porownania [3,6,1,2]
  2. wynik - 1 tabela po [3,1,6,2]
  3. wynik -1 tabela po [3,1,2,6]

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).

  • przynajmniej w implementacji MRI

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'