Sortowanie prawie optymalne 3

Posted by wijet
on Saturday, April 28

Znalazłem trochę informacji w sieci, pierwszy sposób to Bogosort, algorytm bardzo prosty można przedstawić na przykładzie sortowania tali kart
tasujemy karty sprawdzamy czy są posortowane jeśli nie tasujemy jeszcze raz i tak aż do momentu kiedy talia będzie posortowana. Pesymistyczna złożoności obliczeniowa to O(n*n!), korzystamy z losowych permutacji zbioru co powoduje ze możemy nigdy nie otrzymać posortowanego zbioru. W najlepszym przypadku możemy otrzymać posortowany zbiór po jednym losowaniu permutacji zbioru.

Podobnym algorytmem sortowania do Bogosort jest Bozo sort, także opiera się na losowych permutacjach zbioru. Sprawdzamy czy zbiór jest posortowana jeśli nie wybieramy dwa losowe elementy zbioru i zamieniamy ze sobą i znowu sprawdzamy czy zbiór jest posortowany.
Oba algorytmy są wysoce nieefektywne, i raczej nie przydadzą sie w jakich kolwiek zastosowaniach. W wolnej chwili w ramach ćwiczenia rubiego napisałem kawałeczek kodu realizującego te dwa algorytmy.

class Array
  def bogosort!
    shake until is_sorted?
    self
  end
 
  def bozosort!
    until is_sorted?
      a = rand(size-1)
      b = rand(size-1)
      self[a], self[b] = self[b], self[a]
    end
    self
  end
 
  def is_sorted?
    for i in 0..size-2
      if self[i] > self[i+1]
        return false
      end
    end
    true
  end
 
  def shake
    for i in 0..size-1
      a = rand(size-1)
      self[i], self[a] = self[a], self[i]
    end
    self
  end
 
end

Comments

Leave a response

  1. dr_bonzoMay 12, 2007 @ 03:05 PM

    Przydaly by sie jakies pomiary wydajnosci tego algorytmu z np. qsort :D

  2. npbMarch 07, 2008 @ 12:39 PM

    Słyszałem kiedyś o takim języku programowania w którym podaje się specyfikację problemu, a on je rozwiązuje. Podobnie działa właśnie dla posortowania danych. Bo naczym polega problem sortowania? Należy znaleźć taką permutację pierwotnej tablicy, aby spełniony był tam jakiś warunek. Ten język programowania zatem sprawdzał po kolei każdą możliwą permutację i sprawdzał dla której owy warunek jest spełniony :) Na stronę trafiłem przypadkiem – myślałem, że opiszesz tutaj algorytm Forda-Johnsona, który to jest sortowaniem prawie optymalnym jeśli chodzi o liczbę dokonywanych porównań ;) Pozdrawiam!

  3. wijetMarch 09, 2008 @ 01:22 AM

    Mozliwe ze tym jezykiem jest Prolog, tam wlasnie opisujesz problem a nie algorytm rozwiazania. W tym semestrze mam go w szkole, ogolnie pokrecenie z poplataniem bo nalezy zupelnie inaczej podejsc do problemu.

Comment