// indexLastTop - индекс крайней вершины
// nextPosHeapItemsAmount - количество элементво в кучи, вершина которой оказалось максимальной из всех вершин куч
// Возврат: индекс элемента(одной из вершин кучи), который больше чем остальные вершины кучint findPosMaxElem(int[] mas, int curState, int indexLastTop, ref int nextPosHeapItemsAmount) // Функция поиска максимального элемента среди вершин куч
{pos = 0;
// ищим позицию первого единичного бита
while (!Convert.ToBoolean(curState & 1))
{>>= 1;++;
}posMaxTopElem = indexLastTop;= pos;curTopElem = indexLastTop - LeoNum[pos];>>= 1;++;(curState != 0)
{((curState & 1) != 0)
{(mas[curTopElem] > mas[posMaxTopElem])
{= curTopElem;= pos;
}-= LeoNum[pos];
}>>= 1;++;
}posMaxTopElem;
}
void smoothSort(int[] mas) // функция плавная сортировки
{_heap_pool(mas); // вызов функции, создающей последовательность куч из произвольного массива
for (int i = mas.Length - 1; i >= 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;
}
}
}