Tas de Tri en C++
Bon, alors après avoir lutté avec le fait d'essayer de débogage, j'ai finalement renoncé. Je suis un débutant en C++ & Structures de Données et je suis en train de mettre en œuvre des Tas de Tri en C++. Le code qui suit donne de bons résultats sur les nombres entiers positifs, mais semble échouer lorsque j'essaie d'entrer un peu de nombres entiers négatifs.
S'il vous plaît signaler des erreurs/incohérences dans le code suivant. Aussi, toutes les autres suggestions/critiques concernant le sujet sera volontiers apprécié.
//Heap Sort
#include <iostream.h>
#include <conio.h>
int a[50],n,hs;
void swap(int &x,int &y)
{
int temp=x;
x=y;
y=temp;
}
void heapify(int x)
{
int left=(2*x);
int right=(2*x)+1;
int large;
if((left<=hs)&&(a[left]>a[x]))
{
large=left;
}
else
{
large=x;
}
if((right<=hs)&&(a[right]>a[large]))
{
large=right;
}
if(x!=large)
{
swap(a[x],a[large]);
heapify(large);
}
}
void BuildMaxHeap()
{
for(int i=n/2;i>0;i--)
{
heapify(i);
}
}
void HeapSort()
{
BuildMaxHeap();
hs=n;
for(int i=hs;i>1;i--)
{
swap(a[1],a[i]);
hs--;
heapify(1);
}
}
void main()
{
int i;
clrscr();
cout<<"Enter length:\t";
cin>>n;
cout<<endl<<"Enter elements:\n";
for(i=1;i<=n;i++) //Read Array
{
cin>>a[i];
}
HeapSort();
cout<<endl<<"Sorted elements:\n";
for(i=1;i<=n;i++) //Print Sorted Array
{
cout<<a[i];
if(i!=n)
{
cout<<"\t";
}
}
getch();
}
J'ai lu sur des Tas de Tri mais je ne suis pas en mesure de saisir la plupart du concept, et sans qui je ne suis pas tout à fait en mesure de corriger l'erreur de logique(s) ci-dessus.
- J'ai ajouté les devoirs de la balise. Si ce n'est pas, n'hésitez pas à le supprimer.
- ce qui se passe lorsque vous utilisez des nombres négatifs sur l'entrée? Donner un exemple d'entrée et de sortie.
- quelles sont les erreurs?
- Obtenir une copie de la Programmation des Perles par Jon Bentley, et de lire le chapitre sur le tas. Voir product.half.ebay.com/...
- Je ne vois pas comment quelque chose comme cela pourrait fonctionner avec des nombres positifs, mais pas avec les négatifs... Il n'a probablement pas travailler avec des points positifs, vous n'en avez pas remarqué encore.
- Voici un exemple de sortie de quand il fonctionne correctement: Entrer la longueur: 10 Entrez éléments: 10 9 8 7 6 5 4 3 2 1 éléments Triés: 1 2 3 4 5 6 7 8 9 10
- Et ici, la sortie est incorrect. Notez que tous les nombres sont triés à l'exception de la dernière. Entrer la longueur: 10 Entrez éléments: -300 -250 -500 -20 0 0 1 75 100 200 éléments Triés: -500 -250 -20 0 0 1 75 100 200 -300
- Tout d'abord un tas n'est pas triée. Votre "Impression tableau trié" commentaire n'est pas vrai.
- Exemple de sortie est au-dessus. Désolé pour le commentaire redondant. J'ai oublié de vous identifier sur le précédent, et je crois que nous ne pouvons pas modifier les commentaires après un certain temps.
- Chatterjee: ajouter 1000 à chaque élément lors de l'alimentation d'entrée. Si je suis de droite qui va échouer, mais pas les nombres négatifs.
- Ce qui sur terre est
<iostream.h>
? - Oui, vous avez raison! Entrer la longueur: 10 Entrez éléments: 700 750 500 980 1000 1000 1001 1075 1100 1200 éléments Triés: 500 750 980 1000 1000 1001 1075 1100 1200 700
- Mon grand-grand-père
iostream
. - Il était censé facétieusement, pour souligner l'autodérision. 🙂
Vous devez vous connecter pour publier un commentaire.
Vous définissez
hs
après l'appel deBuildMaxHeap
. Commutateur de ces deux lignes.hs=n;
la première ligne deBuildMaxHeap
(après un coup d'oeil dans mon algorithme livre)Lorsque j'ai mis en place mon propre heapsort, je devais être très prudent sur les indices; si vous les index de 0, les enfants sont 2x+1 et 2x+2, lors de l'indexation de 1, les enfants sont 2x et 2x+1. Il y avait beaucoup de silence problèmes à cause de ça. Aussi, chaque opération doit avoir un seul bien écrit siftDown fonction, qui est essentielle.
Ouvrir Wikipédia à la Heapsort Binaire et de tas d'articles et d'essayer de le réécrire de façon plus propre, à la suite de la terminologie et de la notation, si possible. Voici ma mise en œuvre ainsi, peut-être que cela peut vous aider.
Hum maintenant que j'ai vérifié votre code mieux, êtes-vous sûr que votre siftDown/heapify fonction restreint de tamisage à la taille du segment de mémoire?
Edit: Trouvé le problème! Vous n'initialisez pas
hs
àn
avant d'appeler BuildMaxHeap().Je soupçonne que c'est parce que vous êtes 1-fonder le tableau. Il s'agit probablement d'un cas où vous avez accidentellement 0-fondant mais je ne peux pas le repérer dans le code de la main gauche.
Voici un exemple, s'il permet d'.