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;
}