Nadesłany przez mephisto, 23 grudnia 2014 14:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
quicksort.rb:
# QuickSort - implementacja sortowania szybkiego
# created by mephisto
# www.algorytm.org
class QuickSort
def sort(arr)
sort_internally(arr, 0, arr.length-1)
end
# Sprawdza czy tablica zostala posortowana
def is_sorted(arr)
for i in 1...arr.length
return false if less(arr[i], arr[i-1])
return true
end
end
# Wypisuje wszystkie elementy tablicy
def print_elements(arr)
arr.each {|it| print it, " " unless it.nil?}
print "\n"
end
private
def sort_internally(arr, lo, hi)
return if lo >= hi
# wyliczenie indeksu elementu osiowego
j = partition(arr, lo, hi)
# rekurencyjne sortowanie lewej strony
sort_internally(arr, lo, j-1)
# rekurencyjne sortowanie prawej strony
sort_internally(arr, j+1, hi)
end
def partition(arr, lo, hi)
i = lo
j = hi+1
# wartosc elementu osiowego
p = arr[lo]
while true
# odnajdujemy element po lewej stronie, ktory jest mniejszy od osiowego
while less(arr[i+=1], p)
break if i == hi
end
# odnajdujemy element po prawej stronie, ktory jest wiekszy od osiowego
while less(p, arr[j-=1])
break if j == lo
end
#
break if i >=j
exchange(arr, i, j)
end
exchange(arr, lo, j)
return j
end
# Zamienia dwa elementy tablicy o indeksach i, j w tablicy arr
def exchange(arr, i, j)
arr[i], arr[j] = arr[j], arr[i]
end
# Sprawdza czy lewy operand jest mniejszy od prawego
def less(lhs, rhs)
return lhs < rhs
end
end
arr = [4, -6, 8, 90, -67]
sorting = QuickSort.new
sorting.sort(arr)
puts "Nieposortowana!" unless sorting.is_sorted(arr)
sorting.print_elements(arr)

