Utwórz funkcję lub program, który pobiera dwa dane wejściowe:
- Lista liczb całkowitych, które należy posortować (mniej niż 20 elementów)
- Liczba całkowita dodatnia,
N
określająca liczbę porównań
Funkcja zatrzyma się i wyświetli wynikową listę liczb całkowitych po N
porównaniach. Jeśli lista jest w pełni posortowana przed dokonaniem N
porównań, należy posortować listę posortowaną.
Bubble sortowania algorytm jest znany, i myślę, że większość ludzi wie. Poniższy pseudo-kod i animacja (oba z powiązanego artykułu z Wikipedii) powinny zawierać niezbędne szczegóły:
procedure bubbleSort( A : list of sortable items )
n = length(A)
repeat
swapped = false
for i = 1 to n-1 inclusive do
/* if this pair is out of order */
if A[i-1] > A[i] then
/* swap them and remember something changed */
swap( A[i-1], A[i] )
swapped = true
end if
end for
until not swapped
end procedure
Poniższa animacja pokazuje postęp:
Przykład (zaczerpnięty bezpośrednio z powiązanego artykułu z Wikipedii) pokazuje kroki podczas sortowania listy ( 5 1 4 2 8 )
:
Pierwsze przejście
1: ( 5 1 4 2 8 ) -> ( 1 5 4 2 8 ) // Here, algorithm compares the first two elements,
// and swaps since 5 > 1.
2: ( 1 5 4 2 8 ) -> ( 1 4 5 2 8 ) // Swap since 5 > 4
3: ( 1 4 5 2 8 ) -> ( 1 4 2 5 8 ) // Swap since 5 > 2
4: ( 1 4 2 5 8 ) -> ( 1 4 2 5 8 ) // Now, since these elements are already in order
// (8 > 5), algorithm does not swap them.
Druga przepustka
5: ( 1 4 2 5 8 ) -> ( 1 4 2 5 8 )
6: ( 1 4 2 5 8 ) -> ( 1 2 4 5 8 ) // Swap since 4 > 2
7: ( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
8: ( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
Teraz tablica jest już posortowana, ale algorytm nie wie, czy jest zakończony. Algorytm wymaga jednego całego przejścia bez wymiany, aby wiedzieć, że jest posortowany.
Trzecia przepustka
9: ( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
10:( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
11:( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
12:( 1 2 4 5 8 ) -> ( 1 2 4 5 8 )
Przypadki testowe:
Format: Number of comparisons (N): List after N comparisons
Input list:
5 1 4 2 8
Test cases:
1: 1 5 4 2 8
2: 1 4 5 2 8
3: 1 4 2 5 8
4: 1 4 2 5 8
5: 1 4 2 5 8
6: 1 2 4 5 8
10: 1 2 4 5 8
14: 1 2 4 5 8
Input list:
0: 15 18 -6 18 9 -7 -1 7 19 19 -5 20 19 5 15 -5 3 18 14 19
Test cases:
1: 15 18 -6 18 9 -7 -1 7 19 19 -5 20 19 5 15 -5 3 18 14 19
21: -6 15 18 9 -7 -1 7 18 19 -5 19 19 5 15 -5 3 18 14 19 20
41: -6 9 -7 15 -1 7 18 18 -5 19 19 5 15 -5 3 18 14 19 19 20
60: -6 -7 -1 9 7 15 18 -5 18 19 5 15 -5 3 18 14 19 19 19 20
61: -6 -7 -1 7 9 15 18 -5 18 19 5 15 -5 3 18 14 19 19 19 20
81: -7 -6 -1 7 9 15 -5 18 18 5 15 -5 3 18 14 19 19 19 19 20
119: -7 -6 -1 -5 7 9 15 5 15 -5 3 18 14 18 18 19 19 19 19 20
120: -7 -6 -1 -5 7 9 15 5 15 -5 3 18 14 18 18 19 19 19 19 20
121: -7 -6 -1 -5 7 9 5 15 15 -5 3 18 14 18 18 19 19 19 19 20
122: -7 -6 -1 -5 7 9 5 15 15 -5 3 18 14 18 18 19 19 19 19 20
123: -7 -6 -1 -5 7 9 5 15 -5 15 3 18 14 18 18 19 19 19 19 20
201: -7 -6 -5 -1 -5 3 5 7 9 14 15 15 18 18 18 19 19 19 19 20
221: -7 -6 -5 -5 -1 3 5 7 9 14 15 15 18 18 18 19 19 19 19 20
- Tak, wbudowane algorytmy sortowania bąbelkowego są dozwolone.
- Nie, nie można zakładać tylko dodatnich liczb całkowitych lub unikatowych liczb całkowitych.
- Sortowanie musi odbywać się w kolejności opisanej powyżej. Nie możesz zacząć od końca listy
Odpowiedzi:
Galaretka , 25 bajtów
Na podstawie mojej odpowiedzi w J.
Wypróbuj online!
Sprawdź liczbę porównań.
Wyjaśnienie
Łącze pomocnicze modyfikuje listę w indeksie
[i-1, i]
, sortując ją, co daje taki sam wynik jak porównanie sortowania bąbelkowego.źródło
JavaScript (ES6),
10282808680 bajtówPoprawka błędu i 1 bajt zapisane dzięki @ edc65
Rekurencja
może nie byćzdecydowanie niejest prawdopodobnie najlepszym podejściem, ale na razie trzymam się pętli.Wypróbuj to:
Pokaż fragment kodu
źródło
f=(a,m,n=0,_,b=a[n+1])=>b+.5?m?f(a,m-1,n+1,a[n]>b?a[a[n+1]=a[n],n]=b:0):a:f(a,m,0)
.,0
1/b
zamiast tegob+.5
sprawdzićundefined
Haskell,
838281 bajtówPrzykład użycia:
[5,1,4,2,8] ! 5
->[1,4,2,5,8]
.W funkcji
%
y
śledzi elementy odwiedzane do tej pory podczas bieżącego przejścia,x
są jeszcze do sprawdzenia.a
ib
są następnymi dwoma, tj. kandydatami do zamiany. Jeśli dotrzemy do końca listy, zaczynamy od początku:y%x = []%(y++x)
. Wszystkie kroki są przechowywane na liście, na której główna funkcja wybiera tenn
element.Edycja: poprzednie wersje nie działały dla list pojedynczych elementów, na szczęście nowa wersja jest jeszcze krótsza.
źródło
f=
przed drugim wierszem odpowiedzi, a następnie dodaj trzeci wiersz do programu zawierającegomain=print(f [5,1,4,2,8] 5)
. To powinno sprawić, że będzie działać.Python 3,
7774 bajtów-3 bajty dzięki @Maltysen (init
j
w deklaracji)Przypadki testowe w ideone
Używa
sorted
każdej operacji porównywania i zamiany, ale wykonuje sortowanie bąbelkowe.Ustawia
j=0
(lewy indeks), a następnie wykonujen
porównanie i zamianę sąsiednich elementów listy, resetującj
do0
tego, gdy to okno wykracza poza granice.W tym
j*=j<len(l)-1
momencie mnoży sięj
przezFalse
(tj.0
), Natomiast za każdym razem będzie mnożyćj
przezTrue
(tj1
.).(Nadal będzie działać również dla pustej listy).
źródło
j
, możesz użyć%
eval
w MATLAB z powodu przypisań wbudowanych.PowerShell v2 +,
135129 bajtówWięc. Wiele. Dolary
( Zaoszczędzono sześć bajtów, wiedząc, że to wyzwanie nie obejmuje optymalizacji „za darmo” pomijania ostatniego elementu (elementów) przy każdym przejściu, ponieważ jest to gwarantowane posortowane, a zamiast tego przechodzi przez pełne przejście za każdym razem. To przeniosło się
$a.count
dofor
zapętlić i wyeliminować$z
zmienną ).Prosto sortuj bąbelki, z jednym fajnym miejscem, robiąc zamianę w jednym kroku -
$a[$_],$a[$_+1]=$a[$_+1],$a[$_]
Wyjściowa logika jest obsługiwana przez
if(!--$n){$a;exit}
Przypadki testowe
(Tablica jest tutaj pokazana jako oddzielona spacją, ponieważ domyślnym separatorem pól wyjściowych do tworzenia łańcucha jest spacja. Tworzenie łańcuchów ma miejsce, ponieważ łączymy się z etykietami
"$_ -> "
).źródło
R,
132131112136 bajtówProgram odbiera dane wejściowe w następujący sposób: najpierw
N
, a potem sam wektor. Na przykład, jeśli chceszv = [5 1 4 2 8]
in = 1
, wejście, które trafia doscan
jest1 5 1 4 2 8
. Aby uruchomić ten program, uruchom pierwszy wiersz , podaj numery jeden po drugim w konsoli , a następnie uruchom resztę (jest to odpowiedź REPL).Następnie następujący kod załatwia sprawę:
Test:
Aktualizacja: golf 1 bajt dzięki Vlo .
źródło
Pyth,
3432 bajtówTłumaczenie odpowiedzi Pythona Jonathana Allana.
Wypróbuj tutaj!
źródło
JavaScript (ES6),
828079 bajtówNa podstawie oryginalnej odpowiedzi @ ETHproduction. Edycja: Zapisano 2 bajty dzięki @JonathanAllan. Zapisano 1 bajt dzięki @ edc65.
źródło
J ,
6260 bajtówJest to czasownik, który przyjmuje dwa argumenty: liczbę porównań na LHS i listę liczb całkowitych na RHS. Najpierw sprawdza, czy długość listy jest większa niż jeden. Jeśli nie jest, zwraca listę niezmodyfikowaną, w przeciwnym razie działa na niej, wykonując określoną liczbę porównań przed zwróceniem wyniku.
Stosowanie
W pierwszym przypadku testowym polecenia formatowania służą do formatowania wielu wejść / wyjść. Drugi przypadek testowy jest pokazany jako pojedyncze wejście / wyjście.
Wyjaśnienie
Trudno jest napisać zwięzły kod w J, który używa zmienności, więc zamiast tego przekształcam problem w redukowanie listy na zbiorze wskazań. Myślę, że ten kod jest niechlujny, więc omówię zadanie każdej frazy zamiast każdej prymitywnej. Pierwsza część pobiera długość listy i tworzy zakres. Następnie działaj na każdym przyrostku wielkości 2, aby emulować jedno przejście porównań.
Są to początkowe wskaźniki każdego porównania. Jeśli wykonuje się 7 porównań, zmień go, aby uzyskać żądaną kwotę. J parsuje od prawej do lewej, więc zmniejsza się od prawej do lewej, podobnie jak składanie w prawo. Dołącz początkową listę i odwróć ją.
Alternatywnie można wprowadzić zakres [0, 7) i każdą wartość wziąć modulo do długości listy minus 1, aby utworzyć ten sam zakres.
Ostatnia część to czasownik, który pobiera listę na RHS i indeks na LHS, który oznacza indeks początkowy porównania. Wybierz dwa elementy zaczynające się od tego indeksu, posortuj je, podłącz z powrotem do listy i zwróć.
źródło
Matlab,
9391 bajtówOszczędza 11 bajtów, pomijając
if l(i)>l(i+1);l(i:i+1)=l([i+1,i])
, i zamiast tego po prostu sortuj dwa elementy za każdym razem. Działa z listami o długości 1. Można zapisać bajt lub dwa za pomocąm--
operatora Octave , ale to niewiele.Zapisuje dwa kolejne bajty przez ustawienie
n=numel(l)-1;
, ponieważ wtedy mogę po prostu zrobićwhile n
zamiastwhile n>1
ii=mod(i,n)+1
zamiasti=mod(i,n-1)+1
.Dla przypomnienia odpowiedź ta została napisana wiele godzin po utworzeniu wyzwania.
źródło
Groovy (101 bajtów)
EDYCJA: Nie musiałem pisać własnego zamknięcia wymiany, Groovy miał to wbudowane.
Wypróbuj tutaj: https://groovyconsole.appspot.com/script/5104724189642752
Przykład śledzenia wyników:
Stara implementacja (122 bajtów)
Wypróbuj tutaj: https://groovyconsole.appspot.com/script/6316871066320896
źródło
php,
148145 bajtówNie jestem bardzo zadowolony ze struktury pętli, ale podoba mi się przełącznik listy i działa, więc i tak go publikuję. php7.1 pozwoli mi zaoszczędzić co najmniej 4 bajty.
Z ładniejszym formatowaniem:
Edycja: Jörg Hülsermann przypomniał mi o dołączeniu zamiast implode.
Uwaga: musi znajdować się w pliku o nazwie jednoznakowej.
źródło
Rubin,
5250 bajtówZaraz ... nie Ruby?
źródło