コード例 #1
0
        private void TrickleDown(int lastHeapIndex)
        {
            _IsHeapOrdered = false;

            int currentHeapIndex = 0;

            do
            {
                int originalHeapIndex = currentHeapIndex;
                int childHeapIndex1   = (currentHeapIndex << 1) + 1;
                int childHeapIndex2   = childHeapIndex1 + 1;

                if (lastHeapIndex > childHeapIndex1 && HeapEntry.Compare(_HeapEntries[currentHeapIndex], _HeapEntries[childHeapIndex1]) > 0)
                {
                    currentHeapIndex = childHeapIndex1;
                }

                if (lastHeapIndex > childHeapIndex2 && HeapEntry.Compare(_HeapEntries[currentHeapIndex], _HeapEntries[childHeapIndex2]) > 0)
                {
                    currentHeapIndex = childHeapIndex2;
                }

                if (currentHeapIndex == originalHeapIndex)
                {
                    break;
                }

                SwapHeapPositions(currentHeapIndex, originalHeapIndex);
            } while (true);
        }
コード例 #2
0
        private int TrickleUp(int heapIndex)
        {
            while (heapIndex > 0)
            {
                int parentHeapIndex = (heapIndex - 1) >> 1;

                if (HeapEntry.Compare(_HeapEntries[heapIndex], _HeapEntries[parentHeapIndex]) < 0)
                {
                    _IsHeapOrdered = false;
                    SwapHeapPositions(heapIndex, parentHeapIndex);
                    heapIndex = parentHeapIndex;
                }
                else
                {
                    break;
                }
            }

            return(heapIndex);
        }