C'est une question de code-golf.
Contribution
Une liste d'entiers non négatifs dans n'importe quel format est la plus pratique.
Production
La même liste dans l'ordre trié dans n'importe quel format est la plus pratique.
Restriction
- Votre code doit s'exécuter en temps O (n log n) dans le pire des cas où
n
est le nombre d'entiers en entrée. Cela signifie que le tri rapide aléatoire est sorti par exemple. Cependant, il existe de nombreuses autres options parmi lesquelles choisir. - N'utilisez pas de bibliothèque de tri / fonction / similaire. N'utilisez pas non plus ce qui fait la plupart du travail de tri pour vous comme une bibliothèque de tas. Fondamentalement, quoi que vous implémentiez, implémentez-le à partir de zéro.
Vous pouvez définir une fonction si vous le souhaitez, mais veuillez en montrer un exemple dans un programme complet qui fonctionne réellement. Il devrait fonctionner correctement et rapidement sur tous les cas de test ci-dessous.
Cas de test
In: [9, 8, 3, 2, 4, 6, 5, 1, 7, 0]
Out:[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In: [72, 59, 95, 68, 84]
Out:[59, 68, 72, 84, 95]
In: [2, 2, 1, 9, 3, 7, 4, 1, 6, 7]
Out:[1, 1, 2, 2, 3, 4, 6, 7, 7, 9]
In: [2397725, 1925225, 3304534, 7806949, 4487711, 8337622, 2276714, 3088926, 4274324, 667269]
Out:[667269,1925225, 2276714, 2397725,3088926, 3304534, 4274324, 4487711, 7806949, 8337622]
Vos réponses
Veuillez indiquer l'algorithme de tri que vous avez mis en œuvre et la longueur de votre solution dans le titre de votre réponse.
O (n log n) algorithmes de tri temporel
Il existe de nombreux algorithmes de temps O (n log n). Ce tableau contient une liste de certains d'entre eux.
intersect
le tri automatique du tableau. Je suppose que vous voulez aussi les exclure. Que diriez-vousunique
(supprimer les doublons, trier le résultat)?intersect
relève de "similaire" s'il trie automatiquement le tableau. Si vous supprimez les doublons, vous obtiendrez une sortie incorrecte.Réponses:
Haskell,
878089Il s'agit d'un tri par fusion, implémenté de bas en haut. nous emballons d'abord chaque élément dans sa propre liste, puis les fusionnons deux par deux, puis les fusionnons à nouveau deux par deux, jusqu'à ce que nous nous retrouvions avec une seule liste.
(%)
est la fonction de fusionj
fusionne les paires dans une liste de listesr
fusionne une liste complète de listess
est la fonction de tri.Utilisation: lancez un interprète et entrez
s [3,5,2,6,7]
.Edit: la façon dont je fusionnais les choses avant n'était pas le bon ordre, donc pour y remédier, j'avais besoin de 9 caractères supplémentaires.
la source
main = print (s [5,3,6,8])
, qui sera définie comme principale pour imprimer le résultat du tri.[]%s=s
, car si le premier élément est[]
, la(x:a)
correspondance échoue et le dernier cas retourne les éléments, donc ças%[]
réussit.JavaScript (ES6),
195193191189188186183182179174172 octetsIl s'agit d'une implémentation heapsort. Je m'attends à ce que quelqu'un propose une fusion plus courte, mais j'aime celle-ci: P
Mise à jour: R mergesort battu. Ruby up next: D
Test (Firefox)
Afficher l'extrait de code
la source
Python3, 132 octets
Mergesort simple. Beaucoup d'octets ont été dépensés pour s'assurer que cela fonctionne réellement dans O (n log n), si seulement l' algorithme , mais pas l' implémentation doit être O (n log n), cela peut être raccourci:
Python3, 99 octets
Ce n'est pas O (n log n) car
.pop(0)
c'est O (n), ce qui rend la fonction de fusion O (n ^ 2). Mais c'est assez artificiel, comme cela.pop(0)
aurait pu facilement être O (1).la source
Julia, 166 octets
La fonction principale est appelée
M
et elle appelle une fonction d'assistancem
. Il utilise le tri par fusion , dont O ( n log n ) est la complexité la plus défavorable.Exemple d'utilisation:
Non golfé:
la source
R, 181 octets, Mergesort
En retrait, avec de nouvelles lignes:
Cas de test:
la source
Scala, fonction 243 octets (application autonome 315 octets), Mergesort
Cette réponse est destinée à être une fonction, mais peut être étendue pour être une application autonome.
Fonction uniquement (243 octets):
Application autonome (315 octets):
Usage:
Exemple d'entrée:
Production:
Contraintes et considérations:
Attribution:
m()
fonction) inspirée de cette réponse: /codereview//a/21590/28856la source
Gelée, 29 octets, tri par fusion
Comme la réponse Python d'orlp, cela utilise
list.pop(0)
sous le capot, ce qui estO(n)
, mais l'implémentation est formelleO(n log n)
.Essayez-le ici.
Explication
la source
.pop(0)
c'est O (n), ce qui rend la fonction de fusion O (n ^ 2). Mais c'est assez artificiel, comme cela.pop(0)
aurait pu facilement être O (1).Ḣ
est implémenté en tant que.pop(0)
.Rubis, 167 octets
Algorithme de tri par fusion golfé, qui a le pire des cas O (n log n)
Testez-le ici!
Pour tester, copiez et collez le code dans la fenêtre et ajoutez
puts f[x]
en bas, où x est un tableau avec l'entrée. (Assurez-vous que vous sélectionnez Ruby comme langue, bien sûr) Par exemple,puts f[[2, 2, 1, 9, 3, 7, 4, 1, 6, 7]]
la source
Rubis, 297 octets
Tri par fusion. Programme complet, au lieu d'une fonction. Nécessite deux arguments à l'exécution: fichier d'entrée et fichier de sortie, chacun avec un élément par ligne.
la source
$stdin.readlines
est déjà moins d'octets queopen(ARGV[0]).readlines
, même avecputs
plusopen(ARGV[1],"w"){|f|f.puts
if $0==__FILE__
c'est vraiment inutile dans un golf de code. Vous pouvez également condenser le remplacement de chacun;
par une nouvelle ligne - c'est le même nombre d'octets et (probablement) supprime le défilement horizontal du code. En outre, je vous recommande de consulter des conseils pour jouer au golf à Ruby .