heap sort c with examples
Une introduction au tri de tas avec des exemples.
Heapsort est l'une des techniques de tri les plus efficaces. Cette technique crée un tas à partir du tableau non trié donné, puis utilise à nouveau le tas pour trier le tableau.
Heapsort est une technique de tri basée sur la comparaison et utilise un tas binaire.
=> Lisez la série de formations Easy C ++.
qa interview questions et réponses pdf
Ce que vous apprendrez:
- Qu'est-ce qu'un tas binaire?
- Algorithme général
- Illustration
- Exemple C ++
- Exemple Java
- Conclusion
- lecture recommandée
Qu'est-ce qu'un tas binaire?
Un tas binaire est représenté à l'aide d'un arbre binaire complet. Un arbre binaire complet est un arbre binaire dans lequel tous les nœuds à chaque niveau sont complètement remplis à l'exception des nœuds feuilles et les nœuds sont aussi loin que gauche.
Un tas binaire ou simplement un tas est un arbre binaire complet dans lequel les éléments ou les nœuds sont stockés de telle sorte que le nœud racine est supérieur à ses deux nœuds enfants. Ceci est également appelé tas max.
Les éléments du tas binaire peuvent également être stockés sous forme de tas min dans lequel le nœud racine est plus petit que ses deux nœuds enfants. Nous pouvons représenter un tas comme un arbre binaire ou un tableau.
Tout en représentant un tas comme un tableau, en supposant que l'index commence à 0, l'élément racine est stocké à 0. En général, si un nœud parent est à la position I, alors le nœud enfant gauche est à la position (2 * I + 1) et le nœud droit est à (2 * I +2).
Algorithme général
Ci-dessous est l'algorithme général pour la technique de tri de tas.
- Construisez un tas maximum à partir des données données de telle sorte que la racine soit l'élément le plus élevé du tas.
- Supprimez la racine, c'est-à-dire l'élément le plus élevé du tas et remplacez-le ou échangez-le avec le dernier élément du tas.
- Ajustez ensuite le tas max, afin de ne pas violer les propriétés max heap (heapify).
- L'étape ci-dessus réduit la taille du tas de 1.
- Répétez les trois étapes ci-dessus jusqu'à ce que la taille du tas soit réduite à 1.
Comme le montre l'algorithme général pour trier l'ensemble de données donné dans un ordre croissant, nous construisons d'abord un tas maximum pour les données données.
Prenons un exemple pour construire un tas max avec le jeu de données suivant.
6, 10, 2, 4, 1
Nous pouvons construire un arbre pour cet ensemble de données comme suit.
Dans la représentation arborescente ci-dessus, les nombres entre crochets représentent les positions respectives dans le tableau.
Afin de construire un tas maximum de la représentation ci-dessus, nous devons remplir la condition de tas que le nœud parent doit être plus grand que ses nœuds enfants. En d'autres termes, nous devons «heapify» l'arbre afin de le convertir en max-heap.
Après la heapification de l'arbre ci-dessus, nous obtiendrons le tas max comme indiqué ci-dessous.
Comme indiqué ci-dessus, nous avons ce tas maximum généré à partir d'un tableau.
Ensuite, nous présentons une illustration d'un tri de tas. Après avoir vu la construction de max-heap, nous ignorerons les étapes détaillées pour construire un max-heap et montrerons directement le tas max à chaque étape.
Illustration
Considérez le tableau d'éléments suivant. Nous devons trier ce tableau en utilisant la technique de tri de tas.
Construisons un tas max comme indiqué ci-dessous pour le tableau à trier.
Une fois le tas construit, nous le représentons sous la forme d'un tableau comme indiqué ci-dessous.
Maintenant, nous comparons le 1stnode (racine) avec le dernier nœud, puis échangez-les. Ainsi, comme illustré ci-dessus, on permute 17 et 3 pour que 17 soit à la dernière position et 3 soit à la première position.
Maintenant, nous supprimons le nœud 17 du tas et le mettons dans le tableau trié comme indiqué dans la partie ombrée ci-dessous.
Maintenant, nous construisons à nouveau un tas pour les éléments du tableau. Cette fois, la taille du tas est réduite de 1 car nous avons supprimé un élément (17) du tas.
Le tas des éléments restants est illustré ci-dessous.
Dans l'étape suivante, nous répéterons les mêmes étapes.
Nous comparons et échangeons l'élément racine et le dernier élément du tas.
Après l'échange, nous supprimons l'élément 12 du tas et le déplaçons dans le tableau trié.
Une fois de plus, nous construisons un tas maximum pour les éléments restants comme indiqué ci-dessous.
Maintenant, nous échangeons la racine et le dernier élément, c'est-à-dire 9 et 3. Après l'échange, l'élément 9 est supprimé du tas et placé dans un tableau trié.
À ce stade, nous n'avons que trois éléments dans le tas, comme indiqué ci-dessous.
Nous échangeons 6 et 3 et supprimons l'élément 6 du tas et l'ajoutons au tableau trié.
Maintenant, nous construisons un tas des éléments restants, puis nous échangeons les deux entre eux.
comment ouvrir un fichier torrent sous windows
Après avoir permuté 4 et 3, nous supprimons l'élément 4 du tas et l'ajoutons au tableau trié. Maintenant, nous n'avons qu'un seul nœud restant dans le tas comme indiqué ci-dessous .
Alors maintenant, avec un seul nœud restant, nous le supprimons du tas et l'ajoutons au tableau trié.
Ainsi, le tableau ci-dessus est le tableau trié que nous avons obtenu à la suite du tri de tas.
Dans l'illustration ci-dessus, nous avons trié le tableau par ordre croissant. Si nous devons trier le tableau dans l'ordre décroissant, nous devons suivre les mêmes étapes, mais avec le tas min.
L'algorithme Heapsort est identique au tri par sélection dans lequel nous sélectionnons le plus petit élément et le plaçons dans un tableau trié. Cependant, le tri de tas est plus rapide que le tri par sélection en ce qui concerne les performances. Nous pouvons le dire car heapsort est une version améliorée du tri par sélection.
Ensuite, nous implémenterons Heapsort en langage C ++ et Java.
La fonction la plus importante dans les deux implémentations est la fonction «heapify». Cette fonction est appelée par la routine heapsort principale pour réorganiser le sous-arbre une fois qu'un nœud est supprimé ou lorsque max-heap est construit.
Une fois que nous aurons correctement entassé l'arborescence, ce n'est qu'alors que nous pourrons obtenir les éléments corrects dans leurs positions appropriées et ainsi le tableau sera correctement trié.
Exemple C ++
Voici le code C ++ pour l'implémentation de Heapsort.
#include using namespace std; // function to heapify the tree void heapify(int arr(), int n, int root) { int largest = root; // root is the largest element int l = 2*root + 1; // left = 2*root + 1 int r = 2*root + 2; // right = 2*root + 2 // If left child is larger than root if (l arr(largest)) largest = l; // If right child is larger than largest so far if (r arr(largest)) largest = r; // If largest is not root if (largest != root) { //swap root and largest swap(arr(root), arr(largest)); // Recursively heapify the sub-tree heapify(arr, n, largest); } } // implementing heap sort void heapSort(int arr(), int n) { // build heap for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i); // extracting elements from heap one by one for (int i=n-1; i>=0; i--) { // Move current root to end swap(arr(0), arr(i)); // again call max heapify on the reduced heap heapify(arr, i, 0); } } /* print contents of array - utility function */ void displayArray(int arr(), int n) { for (int i=0; i Production:
Tableau d'entrée
4 17 3 12 9 6
meilleur outil de réparation gratuit de windows 7
Tableau trié
3 4 6 9 12 17
Ensuite, nous allons implémenter le heapsort en langage Java
Exemple Java
// Java program to implement Heap Sort class HeapSort { public void heap_sort(int arr()) { int n = arr.length; // Build heap (rearrange array) for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i); // One by one extract an element from heap for (int i=n-1; i>=0; i--) { // Move current root to end int temp = arr(0); arr(0) = arr(i); arr(i) = temp; // call max heapify on the reduced heap heapify(arr, i, 0); } } // heapify the sub-tree void heapify(int arr(), int n, int root) { int largest = root; // Initialize largest as root int l = 2*root + 1; // left = 2*root + 1 int r = 2*root + 2; // right = 2*root + 2 // If left child is larger than root if (l arr(largest)) largest = l; // If right child is larger than largest so far if (r arr(largest)) largest = r; // If largest is not root if (largest != root) { int swap = arr(root); arr(root) = arr(largest); arr(largest) = swap; // Recursively heapify the affected sub-tree heapify(arr, n, largest); } } //print array contents - utility function static void displayArray(int arr()) { int n = arr.length; for (int i=0; i Production:
Tableau d'entrée:
4 17 3 12 9 6
Tableau trié:
3 4 6 9 12 17
Conclusion
Heapsort est une technique de tri basée sur une comparaison utilisant un tas binaire.
Cela peut être qualifié d'amélioration par rapport au tri par sélection, car ces deux techniques de tri fonctionnent avec une logique similaire consistant à rechercher à plusieurs reprises le plus grand ou le plus petit élément du tableau, puis à le placer dans le tableau trié.
Le tri de tas utilise max-heap ou min-heap pour trier le tableau. La première étape du tri du tas consiste à créer un tas min ou max à partir des données du tableau, puis à supprimer l'élément racine de manière récursive et à entasser le tas jusqu'à ce qu'il n'y ait qu'un seul nœud présent dans le tas.
Heapsort est un algorithme efficace et fonctionne plus rapidement que le tri par sélection. Il peut être utilisé pour trier un tableau presque trié ou pour trouver les k éléments les plus grands ou les plus petits du tableau.
Avec cela, nous avons terminé notre sujet sur les techniques de tri en C ++. À partir de notre prochain tutoriel, nous commencerons par les structures de données une par une.
=> Recherchez la série complète de formations C ++ ici.
lecture recommandée
- Méthode MongoDB Sort () avec exemples
- Commande de tri Unix avec syntaxe, options et exemples
- Fusionner le tri en C ++ avec des exemples
- Shell tri en C ++ avec des exemples
- Tri par insertion en C ++ avec des exemples
- Sélection de tri en C ++ avec des exemples
- Tri à bulles en C ++ avec des exemples
- Tri rapide en C ++ avec des exemples