algorytm.org

Implementacja w Ruby



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Sortowanie szybkie (quicksort) - Implementacja w Ruby
Ocena użytkownikóww: *****  / 2
SłabyŚwietny
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)
Dodaj komentarz