ти виконуємо
{= 2 * k;
//вибираємо більшого сина (child lt; n amp; amp; array [child] lt; array [child + 1]) ++; (new_elem gt;=array [child]) break;
//інакше [k]=array [child];// Переносимо сина наверх=child;
} [k]=new_elem;
}
Функція NextState є допоміжною функцією. Робить зворотну операцію, але при цьому вона ще повертає номер біта, відповідний вершині останньої купи, якщо та складається більш ніж з одного елемента. Інакше функція повертає - 1.int NextState (ref int curState)//Функція NextState, робить зворотну операцію, але при цьому вона ще повертає номер біта, відповідний вершині останньої купи, якщо та складається більш ніж з одного елемента. Інакше функція повертає - 1.
{posNewTop=- 1;// Позиція вершини об'єднаних куп.
//виняток ((curState amp; 7) == 5)
{// curState=0101 +=3;// CurState=1000=3;
}
else//намагаємося знайти два поспіль одиничних біта
{next=curState; pos=0; (next!=0 amp; amp; (next amp; 3)!=3)
{ gt; gt;=1; ++
} ((next amp; 3) == 3)//curState=01100
{+=1 lt; lt; pos;// CurState=10000=pos + 2;
} if ((curState amp; 1)!=0)//curState=x001 |=2;// CurState=x011//curState=xx00 |=1;// CurState=xx01
} posNewTop;
}
Функція PrevState є допоміжною функцією. Вона змінює поточний стан з урахуванням того, що вершина останньої купи виключена з рассмотренія.void PrevState (ref int curState)//Функція PrevState змінює поточний стан з урахуванням того, що вершина останньої купи виключена з розгляду.
{((curState amp; 15) == 8)
{// curState=1000-=3;// CurState=010
}
еlse if ((curState amp; 1)!=0)
{((curState amp; 3) == 3)//curState=x011 ^=2;// CurState=x001//curState=xx01 ^=1;// CurState=xx00
}//іщім перший одиничний біт
{prev=curState; pos=0; (prev!=0 amp; amp;! (Convert.ToBoolean (prev amp; 1)))
{ gt; gt;=1; ++;
} (prev!=0)//curState=xx10000
{^=1 lt; lt; pos; |=1 lt; lt; (pos - 1); |=1 lt; lt; (pos - 2);// CurState=xx01100
}
else
curState=0;
}
}
Функція shiftDown є допоміжною функцією. Вона реалізує просіювання даних масиву «вниз» void shiftDown (int [] mas, int posHeapItemsAmount, int indexLastTop)//Реалізація функції просейкі вниз, в ній задається також mas []
{posCurNode=indexLastTop;// indexLastTop - індекс крайней вершин (posHeapItemsAmount gt; 1)//nextPosHeapItemsAmount - кількість елементв в купи, вершина якої виявилося максимальної з усіх вершин куп
{
//позиція правого синаposR=posCurNode - 1;
//позиція лівого синаposL=posR - LeoNum [posHeapItemsAmount - 2];// Число елементів в поточній купи
int posMaxChild=posL; posNextTop=posHeapItemsAmount - 1;
if (mas [posR] gt; mas [posL])//якщо позиція правого сина більше лівого
{= posR;// То старший син правий
posNextTop=posHeapItemsAmount - 2;
} (mas [posCurNode] lt; mas [posMaxChild])
{(ref mas [posCurNode], ref mas [posMaxChild]);=posNextTop;=posMaxChild;
};
}
}
Функція make_heap_pool є допоміжною функцією. Вона створює послідовності куп з довільного массіва.void make_heap_pool (int [] mas)//Функція створення послідовності куп з довільного масиву.
{(int i=0; i lt; mas.Length; i ++)
{posHeapItemsAmount=NextState (ref curState); (posHeapItemsAmount!=- 1) (mas, posHeapItemsAmount, i);
}
}
Функція findPosMaxElem є допоміжною функцією. Вона шукає максимальний елемент серед вершин куч.int findPosMaxElem (int [] mas, int curState, int indexLastTop, ref int nextPosHeapItemsAmount)//Функція пошуку максимального елемента серед вершин куп
{pos=0;
//іщім позицію першого одиничного біта
while (! Convert.ToBoolean (curState amp; 1))
{ gt; gt;=1; ++;