public int Pop()
        {
            HeapNode result = _innerList[0];
            int      p = 0, p1, p2, pn;

            _innerList[0] = _innerList[_innerList.Count - 1];
            _innerList.RemoveAt(_innerList.Count - 1);
            do
            {
                pn = p;
                p1 = (p << 1) + 1;
                p2 = (p << 1) + 2;
                if (_innerList.Count > p1 && _innerList[p].Weight > _innerList[p1].Weight)
                {
                    p = p1;
                }
                if (_innerList.Count > p2 && _innerList[p].Weight > _innerList[p2].Weight)
                {
                    p = p2;
                }

                if (p == pn)
                {
                    break;
                }

                HeapNode h = _innerList[p];
                _innerList[p]  = _innerList[pn];
                _innerList[pn] = h;
            } while (true);
            return(result.Index);
        }
        public void Push(int index, float weight)
        {
            int p = _innerList.Count, p2;

            _innerList.Add(new HeapNode(index, weight));
            do
            {
                if (p == 0)
                {
                    break;
                }

                p2 = (p - 1) >> 1;
                if (_innerList[p].Weight < _innerList[p2].Weight)
                {
                    HeapNode h = _innerList[p];
                    _innerList[p]  = _innerList[p2];
                    _innerList[p2] = h;

                    p = p2;
                }
                else
                {
                    break;
                }
            } while (true);
        }