Oto dość powszechny wzór algorytmów sortowania:
def sort(l):
while not is_sorted(l):
choose indices i, j
assert i < j
if l[i] > l[j]:
l[i], l[j] = l[j], l[i]
Algorytmy te działają dobrze bo indeksów i
i j
są starannie wybrane, na podstawie stanu listy l
.
Co jednak, jeśli nie moglibyśmy zobaczyć l
, a musielibyśmy wybrać na ślepo? Jak szybko moglibyśmy posortować listę?
Twoim wyzwaniem jest napisanie funkcji, która generuje losową parę wskaźników, biorąc pod uwagę tylko długość l
. W szczególności musisz wygenerować dwa wskaźniki i, j
, z 0 <= i < j < len(l)
. Twoja funkcja powinna działać na dowolnej długości listy, ale będzie oceniana na liście o długości 100.
Twój wynik to średnia liczba wyborów indeksu niezbędnych do posortowania losowo losowo losowej listy zgodnie z powyższym wzorem, przy czym wskaźniki są wybierane zgodnie z funkcją.
Ocenię wyniki, biorąc średnią liczbę wyborów indeksu ponad 1000 prób na jednolicie losowo losowanej liście o długości 100 bez powtarzających się wpisów.
Zastrzegam sobie prawo do przeprowadzenia mniejszej liczby prób, jeśli zgłoszenie jest wyraźnie niezgodne z zasadami konkurencji lub nie zakończy się, i przeprowadzę więcej prób, aby wyróżnić najlepszych konkurentów i znaleźć pojedynczego zwycięzcę. Jeśli wiele najlepszych zgłoszeń pozostanie w granicach błędu na granicy moich zasobów obliczeniowych, ogłosimy zwycięzcę wcześniejszego zgłoszenia, dopóki nie zostaną wykorzystane dalsze zasoby obliczeniowe.
Oto przykładowy program oceniania w Pythonie:
import random
def is_sorted(l):
for x in range(len(l)-1):
if l[x] > l[x+1]:
return False
return True
def score(length, index_chooser):
steps = 0
l = list(range(length))
random.shuffle(l)
while not is_sorted(l):
i, j = index_chooser(length)
assert (i < j)
if l[i] > l[j]:
l[i], l[j] = l[j], l[i]
steps += 1
return steps
Twoja funkcja może nie utrzymywać żadnego stanu zmiennego, wchodzić w interakcje ze zmiennymi globalnymi, wpływać na listę l
itp. Jedyną wartością wejściową funkcji musi być długość listy l
i musi ona generować uporządkowaną parę liczb całkowitych z zakresu [0, len(l)-1]
(lub odpowiednią dla twojego języka indeksowanie list). Zapytaj, czy coś jest dozwolone w komentarzach.
Zgłoszenia mogą odbywać się w dowolnym darmowym języku. Dołącz uprząż punktacji, jeśli nie została jeszcze opublikowana w Twoim języku. Możesz opublikować tymczasowy wynik, ale zostawię komentarz z oficjalnym wynikiem.
Punktacja to średnia liczba kroków do posortowanej listy na jednolicie losowo losowanej liście o długości 100. Powodzenia.
źródło
Odpowiedzi:
Python, wynik = 4508
Half Life 3 potwierdzone.
Python, wynik = 11009
Najwyraźniej losowe sortowanie bąbelkowe nie robi o wiele gorszego niż normalne sortowanie bąbelkowe.
Optymalne rozkłady dla małej długości
Nie ma możliwości przedłużenia tej długości do 100, ale i tak warto na nią spojrzeć. Obliczyłem optymalne rozkłady dla małych przypadków (długość ≤ 7) przy użyciu spadku gradientu i mnóstwa algebry macierzy. K p pokazuje kolumnie prawdopodobieństwo każdej wymiany w odległości k .
źródło
h
jest to odległość między zamienionymi elementami; nie reprezentuje przodu ani tyłu.Wynik: 4627
Wypróbuj online!
Generuje losowe wskaźniki, których odległość od siebie jest wybierana równomiernie
[1,1,4,16]
. Chodzi o połączenie 1-krokowych swapów z swapami w większych skalach.Ręcznie poprawiłem te wartości dla list o długości 100 i są one prawdopodobnie dalekie od optymalnych. Niektóre wyszukiwania maszynowe mogłyby prawdopodobnie zoptymalizować rozkład na odległości dla strategii losowej pary z wybraną odległością.
źródło
Wynik: 28493
Wypróbuj online!
To rozwiązanie po prostu wybiera odrębne wartości dla zakresu
x
iy
losowo z zakresu i zwraca je w posortowanej kolejności. O ile mogę stwierdzić, działa to lepiej niżx
wybieraniey
spośród pozostałych wartości.źródło
Python, wynik: 39525
Wypróbuj online.
źródło
Python, wynik ≈ 5000
Wypróbowany z wieloma wartościami epsilon, 0.25 wydaje się najlepszy.
Wynik ≈ 8881
Inne podejście. Nie tak dobre i umiera okropnie, a długości nie dzielą liczby segmentów, ale budowanie sprawia przyjemność.
źródło
Wynik: 4583
Wypróbuj online!
Nie mam pojęcia dlaczego. Właśnie wypróbowałem sekwencje wymienione na Wikipedii artical dla shellsort . I ten wydaje się działać najlepiej. Otrzymuje podobny wynik z tym opublikowanym xnor .
źródło
candidates
powinno wyjść z funkcji jako zmienna globalna.Python 2 , 4871
Wypróbuj online!
źródło