Annuaire d'articles
Préface
L'algorithme de tri est l'un des algorithmes les plus basiques dans « Structures de données et algorithmes ».
Les algorithmes de tri peuvent être divisés en tri interne et tri externe . Le tri interne consiste à trier les enregistrements de données en mémoire, tandis que le tri externe est dû au fait que les données triées sont très volumineuses et ne peuvent pas accueillir tous les enregistrements triés en même temps. il faut accéder à la mémoire.
En étudiant les 11 articles précédents, nous avons une compréhension approfondie des dix algorithmes de tri classiques. Cet article résumera, comparera et analysera ces dix algorithmes classiques.
1. Classification des dix principaux algorithmes de tri classiques
Dix algorithmes de tri courants peuvent être divisés en deux grandes catégories :
Tri par comparaison temporelle non linéaire : détermine l'ordre relatif entre les éléments par comparaison, car sa complexité temporelle ne peut pas dépasser O (nlogn) O (nlogn)O ( n l o g n ) , c'est ce qu'on appelle le tri par comparaison temporelle non linéaire.
Tri sans comparaison en temps linéaire : il ne détermine pas l'ordre relatif entre les éléments par comparaison. Il peut dépasser la limite inférieure temporelle du tri basé sur la comparaison et s'exécuter en temps linéaire , c'est pourquoi il est appelé tri sans comparaison en temps linéaire. .
2. Notions associées
- Stable : Si a est à l'origine devant b, et a=b, a sera toujours devant b après le tri ;
- Instable : Si a est à l'origine devant b, et a=b, a peut apparaître après b après le tri ;
- Tri interne : Toutes les opérations de tri sont effectuées en mémoire ;
- Tri externe : Les données étant trop volumineuses, les données sont placées sur le disque et le tri ne peut être effectué que par transmission de données entre le disque et la mémoire ;
- **Complexité temporelle : **La complexité temporelle signifie que le calcul de la complexité temporelle ne calcule pas la durée d'exécution spécifique du programme, mais le nombre de fois où l'algorithme exécute des instructions.
- Complexité spatiale : la complexité spatiale est une mesure de la quantité d'espace de stockage qu'un algorithme occupe temporairement pendant son fonctionnement.
3. Résumé des dix meilleurs algorithmes classiques
Glossaire :
- n : taille des données
- k : le nombre de « seaux »
- Sur place : occupe une mémoire constante et n'occupe pas de mémoire supplémentaire
- Out-place : occupe de la mémoire supplémentaire
4. Contenu supplémentaire
4.1 Différence entre le tri par comparaison et le tri sans comparaison
-
Le tri rapide commun , le tri par fusion, le tri par tas, le tri par bulles, etc. appartiennent au tri par comparaison . Dans le résultat final du tri, l'ordre entre les éléments dépend de la comparaison entre eux. Chaque numéro doit être comparé à d’autres nombres pour déterminer sa position.
Dans un tri tel que le tri à bulles , la taille du problème est n, et comme n fois de comparaison sont nécessaires, la complexité temporelle moyenne est O ( n 2 ) O(n^2)Sur2 ). Dansles tris tels quele tri par fusion et le tri rapideest réduite àLogn Lognla méthode diviser pour régnerl o g n , donc la complexité temporelle moyenne estO ( nlogn ) O(nlogn)O ( nlogn ) .L’avantage du tri comparatif est qu’il convient aux données de toutes tailles et peut être trié quelle que soit la distribution des données. On peut dire que le tri par comparaison convient à toutes les situations nécessitant un tri.
-
Le tri par comptage, le tri par base et le tri par compartiment sont des tris non comparatifs . Le tri non comparatif trie en déterminant combien d'éléments doivent précéder chaque élément. Pour le tableau arr, calculez le nombre d'éléments avant arr[i], puis la position de arr[i] dans le tableau trié est déterminée de manière unique.
Le tri non comparatif doit uniquement déterminer le nombre d'éléments existants avant chaque élément, et tous peuvent être résolus en un seul parcours. Complexité temporelle de l'algorithme O ( n ) O(n)Sur ) .Le tri non comparatif a la complexité temporelle la plus faible, mais il prend de la place pour déterminer la position unique. Par conséquent, il existe certaines exigences en matière d’échelle et de distribution des données.
4.2 Les algorithmes stables sont-ils vraiment stables ?
L'idée de l'algorithme elle-même est indépendante du langage de programmation. Ainsi, lorsque vous écrivez du code pour implémenter l'algorithme, de nombreux détails peuvent être traités différemment. Utiliser un algorithme instable Quelle que soit la manière dont vous écrivez le code lors d'une implémentation spécifique, la position finale du même élément est toujours incertaine (elle peut ne pas changer ou elle peut changer).
L'algorithme de tri stable sera stable si vous gérez bien les détails lors de l'implémentation spécifique , mais les résultats obtenus si certains détails ne sont pas traités sont toujours instables.
4.3 La signification de la stabilité
S’il s’agit simplement d’un simple tri numérique, alors la stabilité ne veut pas dire grand-chose. Par exemple, dans la séquence 1 2 3 3 4, si les positions du premier 3 et du deuxième 3 changent à plusieurs reprises après l'exécution répétée de la méthode de tri, mais pour l'application en amont qui appelle la méthode de tri pour obtenir le résultat du tri, le résultat est toujours 1 2 3 3 4, quant à l'ordre de 3, cela n'a pas d'importance.
Si le contenu trié n'est qu'un certain attribut numérique d'un objet complexe, alors la stabilité n'aura toujours aucun sens (le coût de l'opération dite d'échange est déjà inclus dans le coût de l'algorithme. Si vous n'aimez pas ce coût, il vaut mieux utiliser l'algorithme de conversion ?)
Si le contenu trié est constitué de plusieurs propriétés numériques d'un objet complexe, mais que l'ordre d'origine n'a aucun sens, alors la stabilité n'aura toujours aucun sens.
Alors dans quelles circonstances la « stabilité » de l’algorithme de tri prend-elle un sens ?
Par exemple, les élèves d'une classe ont été triés en fonction de leur carte d'étudiant. Maintenant, je souhaite qu'ils soient triés du plus petit au plus grand en termes d'âge. S'ils ont le même âge, ils doivent être triés par ordre croissant de leur carte d'étudiant. Alors voici la question : si la méthode de tri par âge que vous choisissez est instable, les numéros d'élèves d'un groupe d'élèves du même âge seront-ils perturbés après le tri ? Vous devrez à nouveau trier ce groupe d'élèves du même âge en fonction ? à leurs numéros d'étudiants. S'il s'agit d'un algorithme de tri stable, il me suffit de trier par âge.
(Trier à partir d'une clé, puis trier à partir d'une autre clé, le résultat du premier tri par clé peut être utilisé pour le deuxième tri par clé. Le contenu à trier est constitué de plusieurs attributs numériques d'un objet complexe, et son original L'ordre initial a sens, alors nous devons conserver le sens du tri original sur la base du tri secondaire, et ensuite nous devons utiliser un algorithme stable).
Que signifie la « stabilité » d’un algorithme de tri ? Cela dépend toujours du scénario d'application. Dans de nombreux cas d'utilisation, cela n'a pas de réelle signification, mais dans certains cas, cela a une signification très importante.
Il existe de nombreux algorithmes qui peuvent vous sembler insignifiants aujourd’hui, mais leur stabilité est très importante lorsqu’ils sont placés dans les conditions du cloud computing big data. Par exemple, lors du tri des produits sur Taobao en fonction du volume des ventes, du prix et d'autres conditions, son serveur de données contient beaucoup de données. Par conséquent, un algorithme de tri peu stable a été utilisé, tel que le tri par tas, le tri Shell. Dans le pire des cas, l'effet de tri sera très médiocre, ce qui affectera sérieusement les performances du serveur et l'expérience utilisateur.
4.4 Supplément à la complexité temporelle
La complexité temporelle généralement évoquée est la complexité temporelle dans le pire des cas. La raison en est la suivante : dans le pire des cas, la complexité temporelle est une limite supérieure du temps d'exécution de l'algorithme sur n'importe quelle instance d'entrée, ce qui garantit que l'algorithme ne fonctionnera pas plus longtemps que n'importe quelle autre .
La complexité temporelle moyenne fait référence au temps d'exécution attendu d'un algorithme si toutes les instances d'entrée possibles se produisent avec une probabilité égale . Soit la probabilité de chaque situation pi pip i , la complexité temporelle moyenne estsum (pi ∗ f (n)) sum(pi*f(n))S u M ( p i∗f ( n ))。
4.5 Supplément de complexité spatiale
En utilisant la complexité spatiale du programme, vous pouvez avoir une pré-estimation de la mémoire requise pour exécuter le programme. L'espace de stockage requis lors de l'exécution du programme comprend les deux parties suivantes :
(1) Partie fixe : La taille de cette partie d'espace n'a rien à voir avec le nombre et la valeur des données d'entrée/sortie. Il comprend principalement l'espace occupé par l'espace d'instructions (c'est-à-dire l'espace de code), l'espace de données (constantes, variables simples), etc. Cette partie est un espace statique.
(2) Espace variable : Cette partie de l'espace comprend principalement l'espace alloué dynamiquement et l'espace requis pour la pile récursive. La taille de cette partie de l’espace est liée à l’algorithme.
La complexité spatiale prend en compte la partie variable de l'espace .
Conclusion
Le partage d’aujourd’hui se termine ici ! Si vous pensez que l'article est bon, vous pouvez le soutenir trois fois .
Vous pouvez aussi faire attention pour éviter de ne plus me retrouver à l'avenir !
Il existe de nombreux articles intéressants sur la page d'accueil de Crossoads . Les amis sont invités à commenter. Votre soutien est la motivation de l'auteur pour aller de l'avant !
Permettez-moi de vous donner une compréhension préliminaire de l'algorithme de tri : https://blog.csdn.net/2301_80191662/article/details/142211265
Tri par insertion directe : https://blog.csdn.net/2301_80191662/article/details/142300973
Tri par colline : https ://blog.csdn.net/2301_80191662/article/details/142302553
Tri par sélection directe : https://blog.csdn.net/2301_80191662/article/details/142312028
Tri par tas : https://blog. csdn.net/ 2301_80191662/article/details/142312338
Tri à bulles : https://blog.csdn.net/2301_80191662/article/details/142324131
Tri rapide : https://blog.csdn.net/2301_80191662/article/details/ 142324307
Tri par fusion : https://blog.csdn.net/2301_80191662/article/details/142350640
Tri par comptage : https://blog.csdn.net/2301_80191662/article/details/142350741
Tri par compartiment : https://blog. csdn.net /2301_80191662/article/details/142375338
Tri par base : https://blog.csdn.net/2301_80191662/article/details/142375592
Résumé et analyse des dix principaux algorithmes de tri classiques : https://blog.csdn. net/2301_80191662/article /détails/142211564
Contenu de référence : Si je vous demande : Que signifie la « stabilité » d'un algorithme de tri ? Comment répondez-vous ? (qq.com)