Bildiğiniz en karanlık sıralama algoritması nedir? [kapalı]


22

Ben sadece sortvis.org blog yazısı aracılığıyla cyclesort hakkında okudum . Bu muhtemelen şu ana kadar duyduğum en belirsiz olanı. Çünkü aşina olmadığım matematik kullanıyor (tamsayı kümelerinin permütasyonlarındaki döngüleri tespit ediyor).

Bildiğiniz en belirsiz olan nedir?


4
Okumak için geri gelmeli.
Mark C

Bununla iyi zamanlama, veri yapılarımın sınıfı yeni bir şeyler almaya başladı Şimdi sadece temel çeşitler hakkında değil, aynı zamanda çılgınlar hakkında da bir fikir edinebiliyorum.
Jason

Yanıtlar:



12

Slowsort çarparak ve teslim ederek çalışır (bölmek ve fethetmek yerine). Bu ilginçtir, çünkü en yüksek verimli sıralama algoritması oluşturulabilir (asimptotik olarak ve böyle bir algoritmanın yavaş olmasına rağmen hala her zaman bir sonuç için çalışılması gerekir).

Bu, onu bogosorttan uzaklaştırır çünkü en iyi durumda, bogosort oldukça verimlidir - yani dizi zaten sıralandığında. Slowsort böyle iyi bir durumdan “acı çekmez”. Hatta en iyi durumda, hala çalışma zamanını alır $ \ Omega (n ^ \ frac {\ log_2n} {2 + \ epsilon}) $ için £ değerinin > 0.

İşte Almanca Vikipedi makalesinden uyarlanan sözde kodu :

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, adımlarının sırasını tersine çevirerek en iyi durumda önemsizce daha kötüye gidebilir: ilk olarak, karışık. Sıralanırsa, o zaman dur.
Alex Feinman,

3
@Alex: hayır. Bu hiçbir şeyi değiştirmez. Bogosort hala ilk adımdan sonra bitmiş olacaktı çünkü şans eseri olduğu gibi karıştırma işlemi diziyi sıraladı. Bogosort hala, en kötü durumundan ve ortalama durumundan temelde farklı çalışma zamanı (O (n)) ile belirgin bir en iyi durum davranışı sergiliyor. Slowsort basitçe buna sahip değil.
Konrad Rudolph

Ah, sadece başlangıç ​​koşullarını düşünüyordum, yürütme yollarını değil!
Alex Feinman

Love this :) Hiçbir şey gibi kaba kuvvet ...

8

Bu belirsiz sayılır mı bilmiyorum, ama en saçma sıralama "algoritmaları" biri Bogosort . Bogosort sayfasındaki bağlantılar da eğlencelidir.

Ve "kuantum bogo-sort" bölümündeki bir mücevher var.

Muhtemelen, 2 N evren yaratmak da oldukça yoğundur.

Hmmm ... bunu söyleyebilirsin :-).


Bunu beğendim. Özellikle "Quantum bogosort" fikrini seviyorum :-)
Dean Harding

6

Başka bir belirsiz "algoritma" Akıllı Tasarım Sıralama - ancak hiçbir algoritma daha hızlı veya daha az bellek kullanmıyor :)


Bu algoritmanın en iyi özelliklerinden biri, sadece çalıştığını bilmemizdir - hiçbir şeyi analiz etmeye veya kanıtlamaya gerek yoktur.
Caleb

6

Uyku Sıralama oldukça yenidir.

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

örnek kullanım:

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

5

Ben de bu durumda kabarcık sıralama yanlış cevap olacağını düşünüyorum

:)


3

Knuth Volume 3 1 , alıştırmalardan birine cevaben, MIX assembly dilinde yazabileceğiniz en kısa tür olan temelde eski bir kod golf olan isimsiz bir sıralama algoritmasının uygulanmasını sağlıyor. Does O oh-so-minör bedeli kısa kodu (N 3 rağmen) karmaşıklık ...

1 En azından eski baskılarda. Yeni sürüm için MIXAL’de yapılan değişiklikler göz önüne alındığında, hala orada olup olmadığından emin değilim, hatta orijinal MIXAL’de olduğu gibi küçük bir anlam ifade ediyor.



2

En belirsiz olup olmadığını bilmiyorum, ama spagetti sıralaması kullanabileceğiniz durumlarda en iyilerinden biri.


Bu, “uyku düzeni” fikrine oldukça benzerdir ve ilginç bir şekilde, DNA'nın sekanslanması için biyoinformatikte kullanılır (Sanger sekansı).
Konrad Rudolph

2

Orjinal Knuth kitaplarından biri olan "Sıralama ve Arama", sabit disk kullanmadan bir bant dosyasını sıralayan bir işlemi gösteren orta bir katlamaya sahipti. Bence altı teyp sürücüsü kullandı ve açıkça her birinin ileri okunurken, geriye doğru okunduğunda, geri sarıldığında veya boşta olduğunu gösterdi. Bugün eski teknolojinin bir anıtıdır.


1

Bir keresinde bir in vektörünü CRAY assembler'da bubble sorti yaptım. Makine, bir vektör kaydının içeriğini bir sözcük yukarı / aşağı kaydırmanıza izin veren çift kaydırma komutuna sahipti. Diğer her noktayı iki vektör kaydına koyun, daha sonra bitene kadar başka bir hafıza referansı yapmak zorunda kalmadan tam bir baloncuk sıralaması yapabilirsiniz. N ** 2 kabarcık sıralaması dışında, etkili oldu.

Ayrıca bir keresinde 4 vektör uzunluğunda kayan bir nokta yapmam gerekiyordu. Tabloya göre mi yaptım (A2-A1'in işareti biti bir bit, A3-A1 işareti başka bir biti oluşturur ... sonra bir tablodaki permütasyon vektörünü ararsınız. Aslında benim alabildiğim en hızlı çözümdü. yüzer ve tam sayı birimleri birbirinden çok ayrı olsa da, modern mimariler üzerinde iyi çalışmaz.


Bunun için hala kaynağınız var mı? Kontrol etmek isterdim!
sova

Kaynak yok, nihayetinde beni işten çıkaran bir şirket için eski olmayan bir makineydi. Tablo araması zor değil: sb1 = 1 & ((a2-a1) >> 63); sb2 = 2 & ((a3-a1) >> 62); ... index = sb1 | sb2 | sb3 ... takip etti bir tablo arama sırasına göre.
Omega Centauri

1

Google Code Jam, Gorosort adlı bir algoritma hakkında bir sorun yaşadı.

Goro'nun 4 kolu var. Goro çok güçlü. Goro ile uğraşmazsın. Goro'nun N farklı tam sayı dizisini sıralaması gerekiyor. Algoritmalar Goro'nun gücü değil; gücü Goro'nun gücüdür. Goro'nun planı, dizinin birkaç elemanını tutmak için parmaklarını iki eliyle kullanmak ve üçüncü ve dördüncü yumruklarıyla masaya mümkün olduğunca sert vurmak. Bu, dizinin emniyete alınmamış öğelerinin havaya uçmasını, rastgele karıştırılmasını ve boş dizi konumlarına geri düşmesini sağlar.

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


0

Adı hatırlamıyorum, ama temelde öyleydi.

while Array not sorted

  rearrange the array in a random order

Bu, diğer cevaplarda belirtilen bogosort'tur.
MatrixFrog

0

Kabuk sıralama

Belki de algoritmanın kendisi bu kadar belirsiz değildir, fakat gerçekte pratikte kullanılan bir uygulamayı kim isimlendirir? Yapabilirim!

TIGCC (TI-89/92 / V200 grafik hesap makineleri için GCC tabanlı bir derleyici) qsortstandart kitaplığındaki uygulama için Shell sıralamasını kullanır :

__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;
          }
    }
}

Kabuk sıralaması, kod boyutunu düşük tutmak için hızlı bağlantı noktası lehine seçildi. Her ne kadar asimptotik karmaşıklık daha kötü olsa da, TI-89 çok fazla RAM'e sahip değildir (190K, eksi program boyutu ve arşivlenmemiş değişkenlerin toplam boyutu), bu nedenle öğe sayısının artacağını varsaymak biraz güvenlidir. altında.

Yazdığım bir programda çok yavaş olduğundan şikayet ettikten sonra daha hızlı bir uygulama yazıldı. Montaj optimizasyonları ile birlikte daha iyi boşluk boyutları kullanır. Burada bulunabilir: qsort.c

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.