Ciao a tutti! Ho un problema con il seguente programma C++, lo scopo era quella di creare una coda di max priorità a partire da n numeri e di estrarre i k numeri più grandi chiamando k volte la procedura extract-max. Per farlo ho utilizzato la struttura dati heap, e le procedure ad essa correlate tra cui heap-extract-max per determinare i k numeri più grandi. Il problema è che per alcuni input non funziona, tipo se n=7 e k=7. Ho provato a cercare l'errore ma non riesco ad individuarlo, quindi se qualcuno ci riuscisse gliene sarei grata!Grazie!
Ecco il codice:
codice:
#include<stdlib.h>
#include<iostream>
#include <ctime>
using namespace std;
int parent (int i) {return (i+1)/2;} //determina l'indice del padre,
int left (int i){return ((2*i)+1);} //del figlio sinistro
int right (int i) {return ((2*i)+2);} //e del figlio destro del nodo i
void MaxHeapify (int A[], int i, int heapsize)
{
int l=0, r=0, max=i;
l=left(i);
r=right(i);
if (l<heapsize && A[l]>A[i]) //determina l'elemento maggiore tra A[i] e il figlio sinistro
max=l;
else max=i;
if (r<heapsize && A[r]>A[max]) //determina l'elemento maggiore tra il figlio destro
max=r; // e il max attuale
if (max!=i) //se uno dei nodi figli è il max
{swap (A[i], A[max]); //viene scambiato col padre
MaxHeapify (A, max, heapsize); // e viene chiamata la MaxHeapify sulla
} // posizione del padre
}
void BuildMaxHeap (int A[], int dim)
{ for (int i=(dim/2)-1;i>=0;i--) //chiama MaxHeapify su tutti i nodi non foglia
MaxHeapify(A,i,dim);
}
void HeapExtractMax (int A[],int max, int dim,int i)
{
int heapsize=dim;
BuildMaxHeap (A,dim);
max=A[0]; //estrae l'elemento massimo
cout<<"max"<<i+1<<":"<<max<<'\n';
heapsize--; //decrementa la dimensione dell'heap
A[0]=A[heapsize];// posizione l'ultimo elemento dell'heap nella radice
//heapsize--;
MaxHeapify (A,0,heapsize); //chiama MaxHeapify per ripristinare l'ordinamento parziale
}
void print(int A[],int n) { // funzione che stampa a video il vettore A[] generato
for (int i = 0; i < n; i++) {
cout<<"A["<<i+1<<"]="<<A[i]<<'\n';
}
cout << endl;
}
int main()
{
int a,b,k;
clock_t t1;
clock_t t2;
int timepast;
cout<<"Procedura che determina i k numeri piu' grandi in un insieme di n numeri.\n\n";
cout<<"Inserire la dimensione n del vettore di input:\n";
cin>>a;
cout<<"Inserire il valore di k:\n";
cin>>k;
int A[a];
int max;
for(int i=0;i<a;i++)
{
A[i] =rand() ;
}
print(A,a); //stampa a video l'array generato
cout<<endl;
t1=clock();
if (a<=0)
cout<<"Error: underflow! Il vettore di input e' vuoto!\nInserire un valore positivo per n!\n";
else if(k<=0||k>a)
cout<<"Error: k deve avere un valore positivo, che sia minore o uguale ad n!\n\n";
else
for (int i=0;i<k;i++){
HeapExtractMax (A,max,a,i); //chiama k volte HeapExtractMax per determinare i k numeri più grandi
}
t2=clock();
timepast=t2-t1; //calcola il numero dei cicli di clock utilizzati dalla procedura HeapExtractMax
if (a>0 && k>0 && k<=a){
cout<<"\nI "<<k<<" numeri piu' grandi sono stati identificati in\n";
cout<< timepast<< " cicli di clock.\n";
}
system("Pause");
return 0;
}