Angenommen, ich habe eine Liste wie [3, 0, 4, 2, 1]
und ich benutze Auswahlsortierung, um sie zu sortieren. Ich könnte sie folgendermaßen visualisieren:
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
Bei dieser Herausforderung geht es darum, das Sortieren so zu visualisieren.
Eingang
Ihre Eingabe besteht aus einer Liste positiver Ganzzahlen in einem beliebigen Format.
Aufgabe
Ihre Übermittlung sollte die Eingabeliste so sortieren, dass nur zwei Elemente gleichzeitig ausgetauscht werden. Bei jedem Austausch sollte die Übermittlung die Liste und ein Zeichen unter jedem der auszutauschenden Elemente anzeigen. Wenn eine getauschte Nummer mehr als eine Ziffer enthält, kann sich das Zeichen an einer beliebigen Stelle darunter befinden. Am Ende sollte die Einreichung die sortierte Liste anzeigen.
Andere Regeln
- Die Sortierung muss weniger Auslagerungen als n 4 verwenden , wobei n die Länge der Liste ist.
- Die Sortierung muss nicht deterministisch sein.
- Die Zeichen unter dem getauschten Zeichen können alle Zeichen außer Leerzeichen sein.
n^4
? Du bist hier ein bisschen großzügig.0
(bitte korrigieren Sie nur das Beispiel, um Antworten, die nicht mit 0 umgehen können, nicht ungültig zu machen)Antworten:
Perl, 62 Bytes
Beinhaltet +3 für
-p
Geben Sie in STDIN eine einzelne Zeile mit Zahlen ein:
Tauscht wiederholt die erste Inversion aus. Swap-Komplexität ist
O(n^2)
, Zeitkomplexität istO(n^3)
. Verwendet die getauschten Zahlen als Markierung:visisort.pl
:Das Programm unterstützt auch negative Werte und Gleitkommazahlen
Wenn Sie auf einem verbindenden Zeichen bestehen, wird der Code zu 66 Byte:
Aber jetzt werden negative Zahlen und 0 nicht mehr unterstützt (aber das Programm muss sowieso nur positive Ganzzahlen unterstützen. Das
0
im Beispiel ist ein Fehler)quelle
The characters under the swapped can be any char except space.
Sie sollten keine Leerzeichen zwischen den Zahlen in der Markierungslinie haben_
was bedeutet, dass Sie z. B. einfach eine unter die erste Ziffer setzen können, was bedeutet, dass alle dazwischen liegenden Zeichen tatsächlich Leerzeichen wären. Ich stehe also zu meiner Interpretation (es sei denn, das OP ist natürlich anderer Meinung). Aber nur um dich glücklich zu machen, habe ich auch eine Version ohne Leerzeichen hinzugefügt :-)JavaScript (ES6), 158 Byte
Blase sortieren. Beispielausgabe:
quelle
-
unter die,
und dann die beiden|
s immer unter die benachbarten Zahlen setzen.PHP, 248 Bytes
Bubblesort langweilig gewinnt
PHP, 266 Bytes a way mit array_slice und min
modifizierte Ausgabe
I X
statt*~~*
282 Bytes
Wie es funktioniert
Sucht nach dem Minimum in einem Array und nimmt dieses auf die erste Position. Sucht nach dem Minimum ohne erste Position. Usw. Wenn ein Wert doppelt so groß ist, wird der erste Wert getauscht
Ausgabebeispiel
quelle
echo$t."\n";
können Sieecho"$t\n";
ein Byte verwenden und speichern.Haskell,
165164162 BytesDies visualisiert die Auswahlsortierung. Anwendungsbeispiel:
Wie es funktioniert:
s % c
ist eine Hilfsfunktion, dielength (show s) - 2
Kopien von Charakteren erstelltc
. Es wird für den Abstand vor beiden verwendet|
, einmal mitc == ' '
und einmal mitc == '-'
.Die Hauptfunktion
#
nimmt eine Liste an,p
die der sortierte Teil der Liste undx
der noch zu sortierende Teil ist. Die Musterübereinstimmung(h,t:s)<-span(/=minimum x)x
teilt die Listex
an ihrem Minimalelement und bindeth
an das Teil vor dem Minimum,t
an das Minimum selbst unds
an das Teil nach dem Minimum. Der Rest formatiert zwei Zeilen: 1) die Liste in ihrem aktuellen Zustand (p++x
) und 2) den|----|
Teil, gefolgt von einem rekursiven Aufruf von#
mitt
angehängt anp
und dem Kopf vonh
eingefügt zwischen dem Ende vonh
unds
.PS: funktioniert auch mit negativen und / oder Gleitkommazahlen:
Edit: @BlackCap speicherte 2 Bytes. Vielen Dank!
quelle
id=<<[show$p++x,"\n ",[' '|p>[]],p%" ","|",h%"-",['|'|h>[]],"\n",(p++[t])#(drop 1h++take 1h++s)]
Python 2, 267 Bytes
Es funktioniert auch mit Dezimalstellen und negativen Zahlen.
Beispiel:
quelle
JavaScript (ES6), 147
155Die Verwendung von n * n vergleicht aber (glaube ich) die minimale Anzahl von Swaps. Und die Swap-Positionen sind im Vergleich zur langweiligen Bubble-Sorte variabler.
Weniger Golf und hoffentlich verständlicher
Prüfung
quelle
Java 7,
256 241282 BytesVielen Dank an @Geobits und @Axelh für das Speichern von 15 Bytes
Ungolfed
Ausgabe
quelle
out
, Sie müssen so etwas wiePrintStream out=System.out;
irgendwo in Ihren Code einfügen.out
sollten Sie einen Ternären verwenden, anstattif/else
auf beiden Zweigen zu drucken. So etwas wieout.print(a>b?a:b);
stattif(a>b)out.print(a);else out.print(b);
if(j==i|j==m)out.print(a[j]);out.print(" ");
oder noch besser mit einem ternärenout.print((j==i|j==m?a[j]:" ")+" ");
und dann können Sie {} der Schleife entfernen PS: Ich verwende eine Importstatik für die out-Instanz, wenn das inSystem.
vor demout
s), und es ist das fehlende2
und3
auf den beiden letzten Swap-Linien.for(j=0;j<=m&i!=l-1;j++)
Gelee , 36 Bytes
Probieren Sie es online!
Erläuterung
Das in der TIO-Verknüpfung gezeigte Beispiel ist für dieses Programm besonders schwierig. Die
;0
Option in der Nähe des Starts ist erforderlich, um sicherzustellen, dass die Schleife genau an dem Punkt endet, an dem die Eingabe sortiert wird. Dies ist normalerweise nicht erforderlich (da es nach einer weiteren Iteration endet), aber wenn der letzte Swap aus den ersten beiden Elementen besteht (wie hier zu sehen), wird die nochmalige Iteration nicht durchgeführt und macht es unmöglich, den Vorgang abzuschließen die Liste konsistent. Als solches müssen wir sicherstellen, dass wir bei der letzten Schleifeniteration nichts austauschen.quelle