Créez une fonction ou un programme qui prend deux entrées:
- Une liste d'entiers à trier (moins de 20 éléments)
- Un entier positif
N
, indiquant le nombre de comparaisons à effectuer
La fonction doit s'arrêter et afficher la liste résultante d'entiers après les N
comparaisons. Si la liste est entièrement triée avant que les N
comparaisons soient faites, alors la liste triée doit être sortie.
L' algorithme de tri Bubble est bien connu, et je suppose que la plupart des gens le savent. Le pseudo-code et l'animation suivants (tous deux tirés de l'article Wikipedia lié) devraient fournir les détails nécessaires:
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
L'animation ci-dessous montre la progression:
Un exemple (tiré directement de l'article Wikipedia lié) montre les étapes du tri de la liste ( 5 1 4 2 8 )
:
Premier passage
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.
Deuxième passe
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 )
Maintenant, le tableau est déjà trié, mais l'algorithme ne sait pas s'il est terminé. L'algorithme a besoin d'une passe entière sans aucun échange pour savoir qu'il est trié.
Troisième passage
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 )
Cas de test:
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
- Oui, les algorithmes de tri Bubble intégrés sont autorisés.
- Non, vous ne pouvez pas supposer uniquement des entiers positifs ou des entiers uniques.
- Le tri doit être dans l'ordre décrit ci-dessus. Vous ne pouvez pas commencer à la fin de la liste
Réponses:
Gelée , 25 octets
D'après ma réponse dans J.
Essayez-le en ligne!
Vérifiez le nombre de comparaisons.
Explication
Le lien d'aide modifie la liste à l'index
[i-1, i]
en la triant, ce qui produit le même résultat que la comparaison de tri à bulles.la source
JavaScript (ES6),
10282808680 octetsCorrection d'un bug et 1 octet enregistré grâce à @ edc65
La récursion
n'est peut-êtrepas définitivementla meilleure approche, mais je m'en tiens à une boucle pour l'instant.Essaye le:
Afficher l'extrait de code
la source
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
au lieu deb+.5
vérifierundefined
Haskell,
838281 octetsExemple d'utilisation:
[5,1,4,2,8] ! 5
->[1,4,2,5,8]
.En fonction
%
y
conserve une trace des éléments visités jusqu'à présent au cours de la passe en cours,x
sont encore à examiner.a
etb
sont les deux suivants, à savoir les candidats à échanger. Si nous arrivons à la fin de la liste, nous commençons par le début:y%x = []%(y++x)
. Toutes les étapes sont stockées dans une liste où la fonction principale sélectionne len
e élément.Edit: les versions précédentes ne fonctionnaient pas pour les listes d'éléments uniques, heureusement, la nouvelle version est encore plus courte.
la source
f=
avant la deuxième ligne de la réponse, puis ajoutez une troisième ligne au programme contenantmain=print(f [5,1,4,2,8] 5)
. Cela devrait le rendre exécutable.Python 3,
7774 octets-3 octets grâce à @Maltysen (init
j
dans la déclaration)Cas de test chez ideone
Utilise
sorted
pour effectuer chaque opération de comparaison et d'échange, mais il effectue un tri à bulles.Ensembles
j=0
(l'index gauche), puis effectuen
comparer et échanges d'éléments de liste adjacents, de remise à zéroj
à0
chaque fois que cette fenêtre sort des limites.Le
j*=j<len(l)-1
se multiplieraj
parFalse
(c'est0
-à- dire ) à ce moment-là, tandis que toutes les autres fois il se multiplieraj
parTrue
(c'est-à-dire1
).(Cela fonctionnera toujours pour une liste vide aussi.)
la source
j
, vous pouvez utiliser%
eval
dans MATLAB à cause des affectations en ligne.PowerShell v2 +,
135129 octetsDonc. Beaucoup. Dollars.
( Enregistré six octets en réalisant que ce défi ne comprend pas le « gratuitement » l' optimisation de sauter le dernier élément (s) à chaque passage depuis qui est garanti triés, et fonctionne au lieu par un passage complet à chaque fois. Cela a déplacé la
$a.count
dans lafor
boucle et éliminé la$z
variable. )Sorte de bulle droite, avec un endroit astucieux, faisant l'échange en une seule étape -
$a[$_],$a[$_+1]=$a[$_+1],$a[$_]
La logique de sortie est gérée via
if(!--$n){$a;exit}
Cas de test
(Le tableau est affiché comme séparé par des espaces ici car le séparateur de champ de sortie par défaut pour la chaîne d'un tableau est un espace. La chaîne se produit parce que nous concaténons avec les étiquettes
"$_ -> "
.)la source
R,
132131112136 octetsLe programme reçoit l'entrée comme suit: d'abord
N
, puis le vecteur lui-même. Par exemple, si vous voulezv = [5 1 4 2 8]
etn = 1
, l'entrée qui va dans l'scan
est1 5 1 4 2 8
. Donc, pour exécuter ce programme, vous exécutez la première ligne , alimentez les chiffres un par un dans la console , puis exécutez le reste (il s'agit d'une réponse REPL).Ensuite, le code suivant fait l'affaire:
Tester:
Mise à jour: golf 1 octet dû à Vlo .
la source
Pyth,
3432 octetsUne traduction de la réponse Python de Jonathan Allan.
Essayez-le ici!
la source
JavaScript (ES6),
828079 octetsBasé sur la réponse originale de @ ETHproduction. Edit: enregistré 2 octets grâce à @JonathanAllan. 1 octet enregistré grâce à @ edc65.
la source
J ,
6260 octetsC'est un verbe qui prend deux arguments: le nombre de comparaisons sur le LHS et la liste des entiers sur le RHS. Il vérifie d'abord si la longueur de la liste est supérieure à un. Si ce n'est pas le cas, il renvoie la liste non modifiée, sinon il opère dessus en effectuant le nombre de comparaisons spécifié avant de renvoyer le résultat.
Usage
Pour le premier cas de test, des commandes supplémentaires sont utilisées pour formater plusieurs entrées / sorties. Le deuxième cas de test est représenté comme une entrée / sortie unique.
Explication
Il est difficile d'écrire du code laconique en J qui utilise la mutabilité, donc je convertis le problème en réduction d'une liste sur un ensemble d'indices. Je pense que ce code est désordonné, donc je vais vous expliquer le travail de chaque phrase au lieu de chaque primitive. La première partie saisit la longueur de la liste et produit une plage. Ensuite, opérez sur chaque infixe de taille 2 pour émuler un passage de comparaisons.
Ce sont les premiers indices de chaque comparaison. Si 7 comparaisons sont en cours, remodelez-la pour obtenir la quantité souhaitée. J analyse de droite à gauche, donc son réduit de droite à gauche, comme plié à droite. Ajoutez la liste initiale et inversez-la.
Alternativement, la plage [0, 7) peut être créée et chaque valeur prise modulo la longueur de la liste moins 1 pour créer la même plage.
La dernière partie est un verbe qui prend une liste sur le RHS et un index sur le LHS qui marque l'indice de départ de la comparaison. Sélectionnez les deux éléments à partir de cet index, triez-les, puis rebranchez-les dans la liste et renvoyez-la.
la source
Matlab,
9391 octetsEnregistre 11 octets en omettant
if l(i)>l(i+1);l(i:i+1)=l([i+1,i])
, et à la place, trie simplement les deux éléments à chaque fois. Fonctionne pour les listes de longueur 1. Pourrait enregistrer un octet ou deux en utilisant Octavem--
opérateur , mais ce n'est pas beaucoup.Enregistre deux octets supplémentaires en définissant
n=numel(l)-1;
, car alors je peux simplement faire à lawhile n
place dewhile n>1
eti=mod(i,n)+1
au lieu dei=mod(i,n-1)+1
.Pour mémoire, cette réponse a été écrite plusieurs heures après la création du défi.
la source
Groovy (101 octets)
EDIT: Je n'avais pas besoin d'écrire ma propre fermeture de swap, groovy l'avait intégrée.
Essayez-la ici: https://groovyconsole.appspot.com/script/5104724189642752
Exemple de trace de sortie:
Ancienne implémentation (122 octets)
Essayez-le ici: https://groovyconsole.appspot.com/script/6316871066320896
la source
php,
148145 octetsJe ne suis pas très satisfait de la structure de la boucle, mais j'aime le commutateur de liste et cela fonctionne, donc je le poste quand même. php7.1 me permettrait d'économiser au moins 4 octets.
Avec un formatage plus agréable:
Edit: Jörg Hülsermann m'a rappelé de rejoindre, au lieu d'imploser.
note: doit être dans un fichier avec un nom de fichier à un seul caractère.
la source
Rubis,
5250 octetsAttendez ... non Ruby?
la source