2012-12-06 3 views
0

J'écris une fonction pour trier un tableau en utilisant le tri de tas. Jusqu'à présent, j'ai:Le tri de tas ne produit pas une sortie correcte

template <typename Item, typename SizeType> 
void heap_sort(Item data[], SizeType size) { 
vector<int> v(data,data+size); 
SizeType unsorted = size; 

make_heap(v.begin(),v.end()); 

while(unsorted > 1) { 
    --unsorted; 
    swap(data[0], data[unsorted]); 
    reheapify_down(data,unsorted); 
} 
} 

et:

template <typename Item, typename SizeType> 
void reheapify_down(Item data[], SizeType size) { 
SizeType current(0), big_child; 
bool heap_ok = false; 

while(!heap_ok && 2*current+1 < size) { 
    if(2*current+2 > size) 
     big_child = 2*current + 1; 
    else if(data[2*current+1] > data[2*current+2]) 
     big_child = 2*current+1; 
    else 
     big_child = 2*current + 2; 

    if(data[current] < data[big_child]) { 
     swap(data[current],data[big_child]); 
     current = big_child; 
    } 
    else 
     heap_ok = true; 
} 
} 

Quand je lance le programme, il émet un tableau mal trié cependant. Y a-t-il quelque chose qui me manque ou une erreur que j'ai oubliée?

+0

Donnez-nous quelques exemples d'entrée et de sortie. –

+0

Eh bien, mon programme a trié un ensemble aléatoire de valeurs entières à partir de maintenant, mais la sortie d'un tableau aléatoire de taille 10 ressemble à: 0424488971. –

+0

Je vais passer maintenant et mettre en place un tableau de test pour voir ce qu'il produit . –

Répondre

0

Juste quelques suggestions. Tout d'abord, j'écrirais une petite classe proxy qui ne fait rien mais qui vous permet d'utiliser l'indexation basée sur 1 sur votre collection. Tous les calculs d'index utilisés dans heaps supposent une indexation basée sur 1, et il est beaucoup plus facile de compenser l'indexation basée sur 0 dans un endroit que dans tout le code. À l'heure actuelle, j'ai assez de mal à suivre l'indexation pour être sûr que votre reheapify_down est correct. C'est certainement la bonne idée générale, mais il faudrait beaucoup de travail pour être certain que tous les calculs sont bons.

En second lieu, je voudrais écrire un check_heap (ou autre) que vous pouvez utiliser pour vérifier à la fois votre make_heap et votre reheapify_down (en aparté, je décide de chaque « make_heap » ou « heapify », de sorte que les noms serait soit "make_heap" et "remake_heap", soit "heapify" et "reheapify"). Au-delà de cela, cependant, il est difficile d'être certain du problème, d'autant plus que vous n'avez pas inclus le code make_heap dans la question. Si cela ne fonctionne pas correctement, le reste n'a aucun espoir.

Questions connexes