Powiedzmy, że mam listę [3, 0, 4, 2, 1]
i używam sortowania selekcji, aby ją posortować, mógłbym to sobie wyobrazić w następujący sposób:
3,0,4,2,1
|-|
0,3,4,2,1
|-----|
0,1,4,2,3
|-|
0,1,2,4,3
|-|
0,1,2,3,4
Wyzwanie polega na wizualizacji takiego sortowania.
Wejście
Twoje dane wejściowe będą listą liczb całkowitych dodatnich w dowolnym formacie.
Zadanie
Twoje zgłoszenie powinno posortować listę danych wejściowych poprzez zamianę tylko dwóch elementów jednocześnie, a przy każdej wymianie zgłoszenie powinno wyświetlać listę oraz znak pod każdym z wymienianych elementów. Jeśli zamieniona liczba ma więcej niż jedną cyfrę, znak może znajdować się gdziekolwiek pod nią. Na koniec przesłanie powinno wyświetlić posortowaną listę.
Inne zasady
- Sortowanie musi wykorzystywać mniej swapów niż n 4 , gdzie n jest długością listy.
- Sortowanie nie musi być deterministyczne.
- Znaki pod zamianą mogą być dowolnymi znakami oprócz spacji.
n^4
? Jesteś tu trochę hojny.0
(proszę ustalić tylko przykład, tak nie do unieważnienia odpowiedzi, które nie mogą obsługiwać 0)Odpowiedzi:
Perl, 62 bajty
Obejmuje +3 za
-p
Podaj dane jako pojedynczy wiersz liczb na STDIN:
Wielokrotnie zamienia pierwszą inwersję. Złożoność wymiany to
O(n^2)
złożoność czasuO(n^3)
. Używa zamienianych liczb jako znaku:visisort.pl
:Program obsługuje również wartości ujemne i liczby zmiennoprzecinkowe
Jeśli nalegasz na znak łączący, kod staje się 66 bajtami:
Ale teraz nie obsługuje już liczb ujemnych i 0 (ale program i tak musi obsługiwać tylko dodatnie liczby całkowite. W
0
tym przykładzie jest błąd)źródło
The characters under the swapped can be any char except space.
nie powinieneś mieć spacji między liczbą w linii znaku_
pierwszą cyfrę, co oznacza, że wszystkie znaki między nimi byłyby w rzeczywistości spacjami). Dlatego trzymam się mojej interpretacji (chyba że OP oczywiście się nie zgadza). Buit tylko po to, żeby cię uszczęśliwić. Dodałem też wersję bez miejsca :-)JavaScript (ES6), 158 bajtów
Sortowanie bąbelkowe. Przykładowe dane wyjściowe:
źródło
-
pod,
i wtedy dwa|
s będą zawsze pod sąsiednimi liczbami.PHP, 248 bajtów
Nudne wygrywanie w Bubblesort
PHP, 266 bajtów sposobem z array_slice i min
zmodyfikowane wyjście
I X
zamiast*~~*
282 bajtów
Jak to działa
Szuka minimum w tablicy i bierze to na pierwszej pozycji. Szukaj minimum bez pierwszej pozycji .... i tak dalej. Jeśli wartość jest podwójna, pierwsza wartość zostanie zamieniona
Przykład wyjściowy
źródło
echo$t."\n";
możesz użyćecho"$t\n";
i zapisać bajt.Haskell,
165164162 bajtówTo wizualizuje sortowanie według wyboru. Przykład użycia:
Jak to działa:
s % c
to funkcja pomocnicza, która tworzylength (show s) - 2
kopie postacic
. Służy do odstępów przed|
jednymc == ' '
i drugim razemc == '-'
.Główna funkcja
#
przyjmuje listę,p
która jest posortowaną częścią listy, ax
która jest jeszcze częścią do posortowania. Dopasowanie wzorca(h,t:s)<-span(/=minimum x)x
dzieli listęx
przy minimalnym elemencie i wiążeh
się z częścią przed minimum,t
z samym minimum is
częścią po minimum. Reszta to formatowanie dwóch wierszy: 1) listy w jej obecnym stanie (p++x
) i 2)|----|
części, po której następuje rekurencyjne wywołanie#
zt
dopisanym dop
i nagłówkiemh
wstawiony między ogonemh
is
.PS: działa również z liczbami ujemnymi i / lub zmiennoprzecinkowymi:
Edycja: @BlackCap zapisał 2 bajty. Dzięki!
źródło
id=<<[show$p++x,"\n ",[' '|p>[]],p%" ","|",h%"-",['|'|h>[]],"\n",(p++[t])#(drop 1h++take 1h++s)]
Python 2, 267 bajtów
Działa również z liczbami dziesiętnymi i ujemnymi.
Przykład:
źródło
JavaScript (ES6), 147
155Używanie n * n porównuje, ale (uważam) minimalną liczbę zamian. A pozycje zamiany są bardziej zmienne w porównaniu do nudnego rodzaju bąbelków.
Mniej golfa i, mam nadzieję, bardziej zrozumiałe
Test
źródło
Java 7,
256 241282 bajtówDzięki @Geobits i @Axelh za oszczędność 15 bajtów
Nie golfił
wynik
źródło
out
, musisz umieścić cośPrintStream out=System.out;
w kodzie.out
należy użyć trójki zamiast,if/else
jeśli zamierzasz drukować na obu gałęziach. Coś jakout.print(a>b?a:b);
zamiastif(a>b)out.print(a);else out.print(b);
if(j==i|j==m)out.print(a[j]);out.print(" ");
lub jeszcze lepiej za pomocą trójskładnika,out.print((j==i|j==m?a[j]:" ")+" ");
a następnie możesz usunąć {} z pętli PS: Używam statycznego importu dla instancjiSystem.
przedout
s), i brakuje w nim2
i3
na dwóch ostatnich liniach wymiany.for(j=0;j<=m&i!=l-1;j++)
Galaretka , 36 bajtów
Wypróbuj online!
Wyjaśnienie
Przykład pokazany w łączu TIO jest szczególnie trudny dla tego programu;
;0
blisko początku jest konieczne w celu zapewnienia, że pętla kończy się właśnie w momencie, gdy wejście zostanie posortowana. Zwykle nie jest to konieczne (ponieważ zakończy się po kolejnej iteracji), ale jeśli ostatnia zamiana dotyczy pierwszych dwóch elementów (jak pokazano tutaj), kolejna iteracja nie nastąpi i uniemożliwi ukończenie lista konsekwentnie. W związku z tym musimy upewnić się, że nie zamieniamy niczego podczas ostatniej iteracji pętli.źródło