Erstellen Sie eine Funktion oder ein Programm mit zwei Eingaben:
- Eine Liste von Ganzzahlen, die sortiert werden sollen (weniger als 20 Elemente)
- Eine positive Ganzzahl, die
N
angibt, wie viele Vergleiche Sie durchführen sollten
Die Funktion soll anhalten und die resultierende Liste von ganzen Zahlen nach N
Vergleichen ausgeben . Wenn die Liste vor dem N
Vergleichen vollständig sortiert ist, sollte die sortierte Liste ausgegeben werden.
Der Bubble-Sortier- Algorithmus ist allgemein bekannt, und ich denke, die meisten Leute kennen ihn. Der folgende Pseudocode und die Animation (beide aus dem verlinkten Wikipedia-Artikel) sollten die notwendigen Details enthalten:
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
Die Animation unten zeigt den Fortschritt:
Ein Beispiel (direkt aus dem verknüpften Wikipedia-Artikel entnommen) zeigt die Schritte beim Sortieren der Liste ( 5 1 4 2 8 )
:
Erster Pass
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.
Zweiter Durchgang
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 )
Das Array ist jetzt bereits sortiert, der Algorithmus weiß jedoch nicht, ob es vollständig ist. Der Algorithmus benötigt einen ganzen Durchgang ohne Austausch, um zu wissen, dass er sortiert ist.
Dritter Durchgang
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 )
Testfälle:
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
- Ja, integrierte Algorithmen für die Blasensortierung sind zulässig.
- Nein, Sie können nicht nur positive Ganzzahlen oder eindeutige Ganzzahlen annehmen.
- Die Sortierung muss in der oben beschriebenen Reihenfolge erfolgen. Sie können nicht am Ende der Liste beginnen
Antworten:
Gelee , 25 Bytes
Basierend auf meiner Antwort in J.
Probieren Sie es online!
Überprüfen Sie die Anzahl der Vergleiche.
Erläuterung
Der Hilfslink ändert die Liste am Index,
[i-1, i]
indem er sie sortiert, wodurch dasselbe Ergebnis wie beim Vergleich der Blasensortierung erzielt wird.quelle
JavaScript (ES6),
10282808680 ByteFehlerbehebung und 1 Byte gespeichert dank @ edc65
Rekursion
kann nicht sein,ist definitiv nichtwahrscheinlich der beste Ansatz, aber ich bleibe vorerst bei einer Schleife.Versuch es:
Code-Snippet anzeigen
quelle
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
stattdessenb+.5
undefined
Haskell,
838281 BytesAnwendungsbeispiel:
[5,1,4,2,8] ! 5
->[1,4,2,5,8]
.In Funktion
%
y
verfolgt die Elemente, die bisher während des aktuellen Durchlaufs besucht wurden,x
sind diejenigen, die noch zu untersuchen sind.a
undb
sind die nächsten zwei, dh die Kandidaten, die getauscht werden sollen. Wenn wir das Ende der Liste erreicht, beginnen wir von Anfang an :y%x = []%(y++x)
. Alle Schritte werden in einer Liste gespeichert, in der die Hauptfunktion dasn
dritte Element auswählt.Bearbeiten: Vorgängerversionen funktionierten nicht für Einzelelementlisten, zum Glück ist die neue Version noch kürzer.
quelle
f=
vor der zweiten Zeile der Antwort eine dritte Zeile an das Programm an, das enthältmain=print(f [5,1,4,2,8] 5)
. Das sollte es lauffähig machen.Python 3,
7774 Bytes-3 Bytes dank @Maltysen (Init
j
in der Deklaration)Testfälle bei ideone
Verwendet
sorted
für jeden Vergleichs- und Tauschvorgang, führt jedoch eine Blasensortierung durch.Setzt
j=0
(linker Index), führt dannn
Vergleiche und Tauschvorgänge benachbarter Listenelemente durch und wirdj
auf zurückgesetzt,0
wenn dieses Fenster außerhalb der Grenzen liegt.Der
j*=j<len(l)-1
Wille multipliziert sich an diesem Punktj
mitFalse
(dh0
), während er sich jedes Malj
mitTrue
(dh1
) multipliziert .(Es funktioniert auch noch für eine leere Liste.)
quelle
j
, können Sie verwenden%
eval
in MATLAB wegen der Inline-Zuweisungen nicht dieselbe Technik anwenden .PowerShell v2 +,
135 -129 ByteSo. Viele. Dollar.
( Saved sechs Bytes zu erkennen , dass diese Herausforderung beinhaltet nicht das „kostenlos“ Optimierung des letzte Element Überspringen (n) bei jedem Durchlauf , da das ist sortiert garantiert und stattdessen läuft durch einen vollständigen Durchlauf jedes Mal. Das bewegte die
$a.count
in diefor
Schleife und beseitigte die$z
Variable. )Straight-up-Bubble-Sortierung mit einem flotten Fleck, die den Tausch in einem Schritt ausführt -
$a[$_],$a[$_+1]=$a[$_+1],$a[$_]
Die Ausgangslogik wird über gehandhabt
if(!--$n){$a;exit}
Testfälle
(Das Array wird hier durch Leerzeichen getrennt angezeigt, da das Standard- Ausgabefeldtrennzeichen für die String-Kennzeichnung eines Arrays ein Leerzeichen ist. Die String-Kennzeichnung erfolgt, weil wir mit den Beschriftungen verketten
"$_ -> "
.)quelle
R,
132131112136 BytesDas Programm empfängt die Eingabe wie folgt: Zuerst
N
der Vektor selbst. Wenn Sie zum Beispiel wollenv = [5 1 4 2 8]
undn = 1
, den Eingang, der geht inscan
ist1 5 1 4 2 8
. Um dieses Programm auszuführen, führen Sie die erste Zeile aus , geben die Zahlen nacheinander in die Konsole ein und führen dann den Rest aus (dies ist eine REPL-Antwort).Dann macht der folgende Code den Trick:
Prüfung:
Update: 1 Byte aufgrund von Vlo golfen .
quelle
Pyth,
3432 BytesEine Übersetzung von Jonathan Allans Python-Antwort.
Probieren Sie es hier aus!
quelle
JavaScript (ES6),
828079 ByteBasiert auf der ursprünglichen Antwort von @ ETHproduction. Bearbeiten: 2 Bytes dank @ JonathanAllan gespeichert. 1 Byte dank @ edc65 gespeichert.
quelle
J ,
6260 BytesDies ist ein Verb, das zwei Argumente akzeptiert: die Anzahl der Vergleiche in der LHS und die Liste der Ganzzahlen in der RHS. Zuerst wird geprüft, ob die Länge der Liste größer als eins ist. Ist dies nicht der Fall, wird die Liste unverändert zurückgegeben. Andernfalls wird die angegebene Anzahl von Vergleichen ausgeführt, bevor das Ergebnis zurückgegeben wird.
Verwendung
Für den ersten Testfall werden Extras-Befehle verwendet, um mehrere Ein- / Ausgaben zu formatieren. Der zweite Testfall wird als einzelne Ein- / Ausgabe dargestellt.
Erläuterung
Es ist schwierig, in J einen knappen Code zu schreiben, der die Veränderbarkeit nutzt. Stattdessen konvertiere ich das Problem in das Reduzieren einer Liste für eine Reihe von Angaben. Ich denke, dieser Code ist chaotisch, also werde ich den Job jeder Phrase anstelle jedes Primitivs durcharbeiten. Der erste Teil erfasst die Länge der Liste und erzeugt einen Bereich. Bearbeiten Sie dann jedes Infix der Größe 2, um einen Durchgang von Vergleichen zu emulieren.
Dies sind die Startindikatoren für jeden Vergleich. Wenn 7 Vergleiche durchgeführt werden, formen Sie es neu, um die gewünschte Menge zu erhalten. J parst von rechts nach links, so dass es von rechts nach links verkleinert wird, wie rechts falten. Hänge die ursprüngliche Liste an und kehre sie um.
Alternativ kann der Bereich [0, 7) erstellt und jeder Wert modulo der Länge der Liste minus 1 entnommen werden, um den gleichen Bereich zu erstellen.
Der letzte Teil ist ein Verb, das eine Liste in der RHS und einen Index in der LHS aufnimmt, der den Startindex des Vergleichs markiert. Wählen Sie die beiden Elemente aus, die an diesem Index beginnen, sortieren Sie sie, fügen Sie sie wieder in die Liste ein und geben Sie sie zurück.
quelle
Matlab,
9391 BytesSpart 11 Bytes durch Weglassen
if l(i)>l(i+1);l(i:i+1)=l([i+1,i])
und sortiert stattdessen jedes Mal die beiden Elemente. Funktioniert für Listen mit der Länge 1. Mit dem Octave-m--
Operator könnten ein oder zwei Bytes gespeichert werden, aber das ist nicht viel.Spart durch Setzen zwei weitere Bytes
n=numel(l)-1;
, weil ich dann einfachwhile n
stattwhile n>1
undi=mod(i,n)+1
statt machen kanni=mod(i,n-1)+1
.Diese Antwort wurde viele Stunden nach dem Erstellen der Herausforderung geschrieben.
quelle
Groovy (101 Bytes)
BEARBEITEN: Ich musste keinen eigenen Swap-Verschluss schreiben, groovy hat diesen eingebaut.
Versuchen Sie es hier: https://groovyconsole.appspot.com/script/5104724189642752
Beispiel für einen Ausgabe-Trace:
Alte Implementierung (122 Bytes)
Versuchen Sie es hier: https://groovyconsole.appspot.com/script/6316871066320896
quelle
PHP,
148145 BytesIch bin nicht sehr zufrieden mit der Schleifenstruktur, aber ich mag den Listenwechsel und er funktioniert, also poste ich ihn trotzdem. php7.1 würde mir erlauben, mindestens 4 Bytes zu speichern.
Mit schönerer Formatierung:
Edit: Jörg Hülsermann hat mich an Join erinnert, anstatt zu implodieren.
Hinweis: Muss sich in einer Datei mit einem einzelnen Dateinamen befinden.
quelle
Ruby,
5250 BytesWarten Sie ... kein Rubin?
quelle