0

試験でこの質問を受けましたが、何を求められているのかよくわかりません。私が正しいことをしたかどうかを明確にしてもらえますか?

質問

整数配列 A が関数に渡されますmakeHeap。A[0] に n が含まれる場合、A[1] から A[n-1] には任意の順序で数値が含まれます。makeHeapA[1] から A[n-1] までが最小ヒープを含むように記述します。関数は、要素を A[2] 、 A[3] 、... 、 A[n-1] の順序で処理してヒープを作成する必要があります。

私の解決策

void makeHeap(int A[], int n)
{
  int r = n -1 ; 
  for(int i = 1; i <= n/2; i++)
    siftUp(a, i , r );
}

/* i- parent , r - right of the array */ 
void siftUp(int A[], int i , int r )
{
   boolean done = false ; 
   int j = 2* i ; 
   while (j <= r && !done)
   {
     if(A[j] > A[j+1]) // find the smalest child
       j+=1 ; 
     if(A[i] > A[j])
     {
       // code to swap A[i] and A[j]
       i = j ; 
       j = i*2 ;

     } 
     else done = true ; 
   }
}

この解決策はリモートでも正しいですか? また、siftUp関数の正しい名前はありますか?

編集:

私の新しい解決策

void makeHeap(int A[], int n)
{ 
  for(int i = 1; i <= A[0]/2; i++)
    siftUp(A, i );
}

/* i- parent */ 
void siftUp(int A[], int i )
{
   bool done = false ; 
   int j = 2* i ; 
   while (i > 1 && !done)
   {
     if(A[j] > A[j+1]) // find the smallest child
       j+=1 ; 
     if(A[i] > A[j])
     {
       /* swap A[j] and A[i] */
       int temp = A[i]; 
       A[i] = A[j]; 
       A[j] = temp ; 

       j = i ; 
       i = i / 2 ; 


     } 
     else done = true ; 
   }
}
4

1 に答える 1