y"> { gt; gt;=1; ++;
} (prev!=0)//curState=xx10000
{^=1 lt; lt; pos; |=1 lt; lt; (pos - 1); |=1 lt; lt; (pos - 2);// CurState=xx01100
}=0;
}
} void shiftDown (int [] mas, int posHeapItemsAmount, int indexLastTop)//Реалізація функції просейкі вниз, в ній задається також mas []
{posCurNode=indexLastTop;// indexLastTop - індекс крайней вершини
while (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;
};
}
} void make_heap_pool (int [] mas)//Функція створення послідовності куп з довільного масиву.
{(int i=0; i lt; mas.Length; i ++)
{posHeapItemsAmount=NextState (ref curState); (posHeapItemsAmount!=- 1) (mas, posHeapItemsAmount, i);
}
}
//Серед вершин куп знаходимо максимальний елемент
//mas - масив
//curState - число, двійкове подання якого описує поточний масив куп
//indexLastTop - індекс крайней вершини
//nextPosHeapItemsAmount - кількість елементв в купи, вершина якої виявилося максимальної з усіх вершин куп
//Повернення: індекс елементу (однієї з вершин купи), який більше ніж інші вершини кучint findPosMaxElem (int [] mas, int curState, int indexLastTop, ref int nextPosHeapItemsAmount)//Функція пошуку максимального елемента серед вершин куп
{pos=0;
//іщім позицію першого одиничного біта
while (! Convert.ToBoolean (curState amp; 1))
{ gt; gt;=1; ++;
} posMaxTopElem=indexLastTop;=pos; curTopElem=indexLastTop - LeoNum [pos]; gt; gt;=1; ++; (curState!=0)
{((curState amp; 1)!=0)
{(mas [curTopElem] gt; mas [posMaxTopElem])
{= curTopElem;=pos;
} -=LeoNum [pos];
} gt; gt;=1; ++;
} posMaxTopElem;
}
void smoothSort (int [] mas)//функція плавна сортування
{_ heap_pool (mas);// Виклик функції, що створює послідовність куп з довільного масиву
for (int i=mas.Length - 1; i gt;=0; i -)
{nextPosHeapItemsAmount=0; posMaxTopElem=findPosMaxElem (mas, curState, i, ref nextPosHeapItemsAmount);// Максимальний верхній елемент купи отримує значення у вигляді результату функції findPosMaxElem (posMaxTopElem!=I)
{(ref mas [i], ref mas [posMaxTopElem]);// Викликаємо функцію swap і передаємо в неї значення mas [i] і mas [posMaxTopElem] (mas, nextPosHeapItemsAmount, posMaxTopElem);// Викликаємо функцію shiftDown
} (ref curState);// Викликаємо функцію PreveState і передаємо значення, посилаючись (ref) на значення змінної curState
}
} void swap (ref int a, ref int b)//функція перестановки (swap)
{temp=b;=a;=temp;
}
}
}