Jaki jest najbardziej niejasny algorytm sortowania, jaki znasz? [Zamknięte]


22

Właśnie przeczytałem o cyclesort za pośrednictwem postu na blogu sortvis.org. Jest to prawdopodobnie najbardziej niejasny, o jakim dotąd słyszałem, ponieważ wykorzystuje matematykę, której nie znam (wykrywanie cykli w permutacjach zbiorów liczb całkowitych).

Jaki jest najbardziej niejasny, jaki znasz?


4
Musisz wrócić, aby przeczytać.
Mark C

Niezłe wyczucie czasu, moja klasa struktur danych właśnie zaczęła obejmować sortowanie. Teraz rozumiem nie tylko podstawowe rodzaje, ale także zwariowane.
Jason

Odpowiedzi:



12

Slowsort działa przez pomnożenie i poddanie się (w przeciwieństwie do dzielenia i podbijania). Jest to interesujące, ponieważ jest to prawdopodobnie najmniej wydajny algorytm sortowania, który można zbudować (asymptotycznie i z zastrzeżeniem, że taki algorytm, choć powolny, musi cały czas dążyć do osiągnięcia rezultatu).

To równoważy go z bogosortem, ponieważ w najlepszym przypadku bogosort jest dość wydajny - mianowicie, gdy tablica jest już posortowana. Slowsort nie „cierpi” na takie najlepsze zachowanie. Nawet w najlepszym przypadku nadal ma czas działania $ \ Omega (n ^ \ frac {\ log_2n} {2+ \ epsilon}) $ dla ϵ > 0.

Oto jego pseudokod, zaadaptowany z niemieckiego artykułu w Wikipedii :

function slowsort(A, i, j):
  if i >= j: return

  m = (i + j) / 2
  slowsort(A, i, m)
  slowsort(A, m + 1, j)

  if A[j] < A[m]:
    swap(A[j], A[m])

  slowsort(A, i, j - 1)

1
Bogosort można trywialnie uczynić bardziej pesymalnym w najlepszym przypadku, odwracając kolejność jego kroków: po pierwsze, potasuj. Jeśli posortowane, to przestań.
Alex Feinman,

3
@Alex: no. To nic nie zmienia. Bogosort nadal byłby skończony po pierwszym kroku, ponieważ losowo , losowanie posortowałoby sekwencję. Bogosort nadal wykazuje wyraźne zachowanie w najlepszym przypadku z zasadniczo innym czasem działania (O (n)) od najgorszego przypadku i średniego przypadku. Slowsort po prostu tego nie ma.
Konrad Rudolph,

Ach, myślałem tylko o początkowych warunkach, a nie o ścieżkach egzekucji!
Alex Feinman

Uwielbiam to :) Nie ma to jak brutalna siła ...

8

Nie wiem, czy liczy się to jako niejasne, ale jednym z najbardziej absurdalnych „algorytmów” sortowania jest Bogosort . Linki na stronie Bogosort też są fajne.

I jest ten klejnot z sekcji „sortowanie bogactw kwantowych”.

Prawdopodobnie tworzenie 2 N wszechświatów wymaga również dużej ilości pamięci.

Hmmm ... można tak powiedzieć :-).


Ten mi się podoba. Szczególnie podoba mi się pomysł „Quantum bogosort” :-)
Dean Harding

6

Kolejnym niejasnym „algorytmem” jest Inteligentne sortowanie projektów - ale żaden algorytm nie jest szybszy lub ma mniejsze zużycie pamięci :)


Jedną z najlepszych cech tego algorytmu jest to, że wiemy, że on działa - nie trzeba niczego analizować ani udowadniać.
Caleb

6

Sortowanie snu jest raczej nowatorskie.

    #!/bin/bash
    function f() {
        sleep "$1"
        echo "$1"
    }
    while [ -n "$1" ]
    do
        f "$1" &
        shift
    done
    wait

przykładowe użycie:

    ./sleepsort.bash 5 3 6 3 6 3 1 4 7

5

Myślę, że rodzaj bąbelków byłby również złą odpowiedzią w tej sytuacji

:)


3

Knuth Tom 3 1 , w odpowiedzi na jedno z ćwiczeń, przedstawia implementację bezimiennego algorytmu sortowania, który jest w zasadzie starożytnym golfem kodowym - najkrótszym rodzajem, jaki można napisać w asemblerze MIX. Krótki kod jest dostępny w tak nieistotnej cenie złożoności O (N 3 ) ...

1 Przynajmniej w starszych wersjach. Biorąc pod uwagę modyfikacje MIXAL-a dla nowej edycji, nie jestem pewien, czy nadal tam jest, czy nawet nie ma najmniejszego sensu w oryginalnym MIXAL-u.



2

Nie wiem, czy jest to najbardziej niejasne, ale rodzaj spaghetti jest jednym z najlepszych w sytuacjach, w których można go użyć.


Pomysł ten jest dość podobny do „sortowania podczas snu” i co ciekawe, jest wykorzystywany w bioinformatyce do sekwencjonowania DNA (sekwencjonowanie Sanger).
Konrad Rudolph,

2

Jedna z oryginalnych książek Knutha „Sortowanie i wyszukiwanie” miała środkowy rozkład, który przedstawiał proces sortowania pliku taśmy bez użycia dysku twardego. Myślę, że używał sześciu napędów taśmowych i wyraźnie pokazał, kiedy każdy był czytany do przodu, do tyłu, do tyłu lub bezczynnie. Dziś jest pomnikiem przestarzałej technologii.


1

Kiedyś zrobiłem sortowanie bąbelkowe rejestrów wektorowych w asemblerze CRAY. Maszyna miała instrukcję podwójnej zmiany, która pozwoliła na przesunięcie zawartości rejestru wektorowego w górę / w dół o jedno słowo. Umieść co drugi punkt w dwóch rejestrach wektorowych, abyś mógł wykonać pełne sortowanie bąbelkowe bez konieczności tworzenia kolejnego odniesienia do pamięci, dopóki nie skończysz. Z wyjątkiem natury sortowania bąbelkowego N ** 2 była ona wydajna.

Raz też musiałem zrobić jakikolwiek zmiennoprzecinkowy wektor długości 4 tak szybko, jak to możliwe dla pojedynczego sortowania. Zrobiłem to przez przeglądanie tabeli (bit znaku A2-A1 jest jednym bitem, znak A3-A1 tworzy kolejny bit ..., a następnie wyszukujesz wektor permutacji w tabeli. To było w rzeczywistości najszybsze rozwiązanie, jakie mogłem wymyślić z. Nie działa jednak dobrze na nowoczesnych architekturach, jednostki pływające i liczby całkowite są zbyt rozdzielone.


Czy nadal masz na to źródło? Chciałbym to sprawdzić!
sova

Bez źródła, to była niepotrzebna maszyna dla firmy, która ostatecznie mnie zwolniła. Wyszukiwanie w tabeli nie jest trudne: sb1 = 1 & ((a2-a1) >> 63); sb2 = 2 & ((a3-a1) >> 62); ... index = sb1 | sb2 | sb3 ... potem poprzez wyszukiwanie kolejności w tabeli.
Omega Centauri,

1

Google Code Jam miał problem z algorytmem o nazwie Gorosort, który, jak sądzę, wymyślił dla tego problemu.

Goro ma 4 ramiona. Goro jest bardzo silny. Nie zadzieraj z Goro. Goro musi posortować tablicę N różnych liczb całkowitych. Algorytmy nie są siłą Goro; siła jest siłą Goro. Plan Goro polega na użyciu palców na dwóch dłoniach, aby przytrzymać kilka elementów tablicy i uderzyć w stół trzecią i czwartą pięścią tak mocno, jak to możliwe. To sprawi, że niezabezpieczone elementy tablicy wylecą w powietrze, zostaną losowo przetasowane i spadną z powrotem w puste miejsca tablicy.

http://code.google.com/codejam/contest/dashboard?c=975485#s=p3


0

Nie pamiętam nazwy, ale było w zasadzie

while Array not sorted

  rearrange the array in a random order

To jest bogosort, wspomniany w innych odpowiedziach.
MatrixFrog,

0

Sortowanie w skorupkach

Może sam algorytm nie jest tak niejasny, ale kto może nazwać implementację, która faktycznie jest używana w praktyce? Mogę!

TIGCC (kompilator oparty na GCC dla kalkulatorów graficznych TI-89/92 / V200) używa sortowania Shell do qsortimplementacji w swojej standardowej bibliotece:

__ATTR_LIB_C__ void qsort(void *list, short num_items, short size, compare_t cmp_func)
{
  unsigned short gap,byte_gap,i,j;                
  char *p,*a,*b,temp;                       
  for (gap=((unsigned short)num_items)>>1; gap>0; gap>>=1)    // Yes, this is not a quicksort,
    {                                                         // but works fast enough...    
      byte_gap=gap*(unsigned short)size;
      for(i=byte_gap; i<((unsigned short)num_items)*(unsigned short)size; i+=size)
        for(p=(char*)list+i-byte_gap; p>=(char*)list; p-= byte_gap)
          {
            a=p; b=p+byte_gap;
            if(cmp_func(a,b)<=0) break;
            for(j=size;j;j--)
              temp=*a, *a++=*b, *b++=temp;
          }
    }
}

Wybrano sortowanie powłoki na rzecz szybkiego sortowania, aby utrzymać niski rozmiar kodu. Chociaż jego asymptotyczna złożoność jest gorsza, TI-89 nie ma dużo pamięci RAM (190 KB, minus rozmiar programu i całkowity rozmiar niezarchiwizowanych zmiennych), więc można bezpiecznie założyć, że liczba elementów będzie być nisko.

Szybsze wdrożenie zostało napisane po tym, jak narzekałem, że jest zbyt wolny w pisanym przeze mnie programie. Wykorzystuje lepsze rozmiary szczelin wraz z optymalizacjami montażu. Można go znaleźć tutaj: qsort.c

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.