試験でこの質問を受けましたが、何を求められているのかよくわかりません。私が正しいことをしたかどうかを明確にしてもらえますか?
質問
整数配列 A が関数に渡されますmakeHeap
。A[0] に n が含まれる場合、A[1] から A[n-1] には任意の順序で数値が含まれます。makeHeap
A[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 ;
}
}