web-dev-qa-db-fra.com

À quoi sert une sorte de bulle?

Les sortes de bulles ont-elles une utilité réelle? Chaque fois que j'en vois un mentionné, c'est toujours soit:

  1. Un algorithme de tri pour apprendre.
  2. Un exemple d'algorithme de tri pas à utiliser.
45
Jason Baker

Cela dépend de la façon dont vos données sont distribuées - si vous pouvez faire des hypothèses.

L'un des meilleurs liens que j'ai trouvé pour comprendre quand utiliser un tri à bulles - ou un autre tri, est-ce - une vue animée sur les algorithmes de tri:

http://www.sorting-algorithms.com/

43
Remy Sharp

Le tri à bulles est (probablement) le tri le plus rapide disponible dans une circonstance spécifique très. À l'origine, il est devenu bien connu, principalement parce que c'était l'un des premiers algorithmes (de toute nature) qui a été rigoureusement analysé, et la preuve a été trouvée qu'il était optimal dans ses circonstances limitées.

Considérez un fichier stocké sur un lecteur de bande, et si peu de mémoire à accès aléatoire (ou des clés si grandes) que vous ne pouvez charger que deux enregistrements dans la mémoire à un moment donné. Le rembobinage de la bande est suffisamment lent pour que l'accès aléatoire au fichier soit généralement impossible - si possible, vous souhaitez traiter les enregistrements de manière séquentielle, pas plus de deux à la fois.

À l'époque où les lecteurs de bande étaient courants et où les machines avec seulement quelques milliers (mots | octets) de RAM (de quelque sorte que ce soit) étaient courantes, c'était suffisamment réaliste pour mériter d'être étudié. Cette circonstance est maintenant rare, donc étudier le tri à bulles n'a plus de sens du tout - mais pire encore, la situation quand il est optimal n'est pas enseignée de toute façon, donc même quand/si la bonne situation se présentait, presque personne ne le ferait réalisez il.

Dans la mesure où il est le plus rapide sur un ensemble de données extrêmement petit et/ou presque trié, alors que cela peut couvrir la faiblesse du tri à bulles (au moins dans une certaine mesure), un tri par insertion sera essentiellement toujours meilleur pour l'un ou les deux ceux.

76
Jerry Coffin

Il n'est pas beaucoup utilisé dans le monde réel. C'est un bon outil d'apprentissage car il est facile à comprendre et rapide à implémenter. Il a un mauvais cas (O (n ^ 2)) et des performances moyennes. Il présente de bonnes performances dans le meilleur des cas lorsque vous savez que les données sont presque triées, mais il existe de nombreux autres algorithmes qui ont cette propriété, avec de meilleures performances dans le pire et la moyenne des cas.

19
Bill the Lizard

Je suis tombé récemment sur une grande utilité dans une anecdote d'optimisation. Un programme avait besoin d'un ensemble de sprites triés par ordre de profondeur pour chaque image. L'ordre des spites ne changerait pas beaucoup entre les images, donc comme une optimisation, elles ont été triées en bulles avec un seul passage à chaque image. Cela a été fait dans les deux sens (de haut en bas et de bas en haut). Ainsi, les sprites étaient toujours presque triés avec un algorithme O(N) très efficace).

10
workmad3

C'est probablement le plus rapide pour les ensembles minuscules .

En parlant d'éducation. Un lien vers la dernière scène de tri du tri , c'est incroyable. À voir absolument.

7
Cristian Libardo

nous avons récemment utilisé des bullesort dans une preuve d'optimalité pour un algorithme. Nous avons dû transformer une solution optimale arbitraire représentée par une séquence d'objets en une solution trouvée par notre algorithme. Parce que notre algorithme était juste "Trier selon ces critères", nous avons dû prouver que nous pouvons trier une solution optimale sans l'aggraver. Dans ce cas, le tri à bulles était un très bon algorithme à utiliser, car il a l'invariant Nice de simplement échanger deux éléments qui sont côte à côte et qui sont dans le mauvais ordre. L'utilisation d'algorithmes plus compliqués aurait fait fondre le cerveau, je pense.

Salutations.

3
Tetha

C'est bon pour les petits ensembles de données - c'est pourquoi certaines implémentations de qsort y basculent lorsque la taille de la partition devient petite. Mais le tri par insertion est encore plus rapide, il n'y a donc aucune bonne raison de l'utiliser sauf comme aide pédagogique.

3

Bubble sort est facile à implémenter et il est assez rapide lorsque vous avez de petits ensembles de données.

Le tri à bulles est assez rapide lorsque votre ensemble est presque trié (par exemple, un ou plusieurs éléments ne sont pas dans les positions correctes), dans ce cas, il vaut mieux entrelacer les traversées de 0-index à n-index et de n-index à 0-index . En utilisant C++, il peut être implémenté de la manière suivante:

void bubbleSort(vector<int>& v) { // sort in ascending order
  bool go = true;
  while (go) {
    go = false;
    for (int i = 0; i+1 < v.size(); ++i)
      if (v[i] > v[i+1]) {
         swap(v[i], v[j]);
         go = true;
      }
    for (int i = (int)v.size()-1; i > 0; --i) 
      if (v[i-1] > v[i]) {
         swap(v[i-1], v[i]);
         go = true;
      }
  }
}

Cela peut être bon si l'échange de deux éléments adjacents est une puce et l'échange d'éléments arbitraires est coûteux.

Donald Knuth, dans son célèbre "The Art of Computer Programming", a conclu que "le type de bulle semble n'avoir rien à recommander, sauf un nom accrocheur et le fait qu'il conduit à des problèmes théoriques intéressants" =.

Étant donné que cet algorithme est facile à implémenter, il est facile à prendre en charge et il est important dans le cycle de vie réel d'une application de réduire les efforts d'assistance.

2
sergtk

Je pense que c'est un bon algorithme "d'enseignement" car il est très facile à comprendre et à mettre en œuvre. Il peut également être utile pour de petits ensembles de données pour la même raison (bien que certains des algorithmes O (n lg n) soient assez faciles à implémenter également).

2
Jay Conrod

Je ne peux pas résister à répondre à des remarques sur le tri des bulles en mentionnant le plus rapide (semble être O (nlogn), mais ce n'est pas vraiment prouvé) Comb Sort . Notez que le tri par peigne est un peu plus rapide si vous utilisez une table précalculée. Le tri en peigne est exactement le même que le tri en bulles, sauf qu'il ne commence pas initialement par l'échange d'éléments adjacents. Il est presque aussi facile à mettre en œuvre/à comprendre que le tri à bulles.

2
Brian

Je l'utilisais dans certains cas pour le petit N sur le modèle TRS-80 1. En utilisant une boucle for, on pouvait implémenter le tri complet sur une ligne de programme.

En dehors de cela, c'est bon pour l'enseignement, et parfois pour les listes qui sont presque dans l'ordre trié.

1
EvilTeach

Je l'ai utilisé une fois pour un cas où la grande majorité du temps, il trierait deux articles.

La prochaine fois que j'ai vu ce code, quelqu'un l'avait remplacé par le type de bibliothèque. J'espère qu'ils l'ont d'abord comparé!

1
Mark Ransom

Il est rapide et facile à coder et (presque impossible de se tromper). Il a sa place si vous ne faites pas de gros travaux et il n'y a pas de support de tri de bibliothèque.

1
Brian Knoblauch

C'est le genre que j'utilise le plus souvent en fait. (Dans notre projet, nous ne pouvons utiliser aucune bibliothèque externe.)

C'est utile quand je sais avec certitude que l'ensemble de données est vraiment petit, donc je ne me soucie pas du tout de la vitesse et je veux du code le plus court et le plus simple.

La bulle n'est pas la plus basse possible. Récemment, j'étais dans une situation où je devais trier exactement trois éléments. J'ai écrit quelque chose comme ça:

// Use sort of stooge to sort the three elements by cpFirst

SwapElementsIfNeeded(&elementTop, &elementBottom);
SwapElementsIfNeeded(&elementTop, &elementMiddle);
SwapElementsIfNeeded(&elementMiddle, &elementBottom);

*pelement1 = elementTop;
*pelement2 = elementMiddle;
*pelement3 = elementBottom;
1
buti-oxa

Oh oui, c'est un bon mécanisme de sélection. Si vous le trouvez dans du code écrit par quelqu'un, vous ne l'embauchez pas.

0
Stephan Eggermont

Surtout rien. Utilisez plutôt QuickSort ou SelectionSort ...!

0
Thomas Hansen