Je recherche un algorithme de tri pour les tableaux int qui n'alloue aucun octet autre que la taille du tableau et est limité à deux instructions:
SWAP: échange le prochain index avec celui en cours;
MOVE: déplace le curseur sur un index +1 ou -1;
Autrement dit, vous ne pouvez pas échanger des index non voisins, ni échanger l'index 100
, après avoir simplement échangé l'index 10
. Quel est l'algorithme le plus efficace - c'est-à-dire celui qui utilise le moins de mouvements totaux?
algorithms
sorting
in-place
MaiaVictor
la source
la source
Réponses:
Considérez le tri du shaker à cocktail , qui est une version bidirectionnelle du tri à bulles. Vous faites des bulles de bas en haut, puis (c'est la partie ajoutée) vous faites des bulles de haut en bas, répétez jusqu'à ce que cela soit fait. C'est toujours , mais cela fait beaucoup moins de passes en moyenne, car les petits éléments près de l'extrémité supérieure du tableau seront déplacés vers leur position finale en une seule passe plutôt que N passes. De plus, vous pouvez garder une trace des positions les plus basses et les plus hautes où un swap s'est produit; les passes suivantes n'ont pas besoin de balayer au-delà de ces points.O ( n2)
la source
Le nombre de swaps d'éléments adjacents nécessaires pour commander un tableau est égal au nombre d'inversions dans le tableau. Avec n éléments au total, il y a au plus n * (n-1) / 2 inversions, donc le tri par bulles donne le nombre asymptotiquement optimal de swaps dans ce modèle.
la source
L'algorithme qui n'utilise pas d'indicateur booléen pour savoir si nous avons échangé un élément ou non, est donné ci-dessous (l'astuce pour conserver les informations dans l'état de la machine, plutôt que dans la mémoire):
La solution d'Eric Lippert, le tri gnome fonctionne également, car il s'agit essentiellement d'un tri à bulles bidirectionnel.
la source