⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 heap.java

📁 java 的源代码
💻 JAVA
字号:
package com.reddragon2046.base.utilities.data.algorithms;

import com.reddragon2046.base.utilities.data.*;

// Referenced classes of package com.reddragon2046.base.utilities.data.algorithms:
//            Predicates

public final class Heap
{

    private Heap()
    {
    }

    public static void pushHeap(BidirectionalIterator first, BidirectionalIterator last)
    {
        pushHeap(first, last, ((BinaryPredicate) (new Predicates.HashComparator())));
    }

    public static void pushHeap(BidirectionalIterator first, BidirectionalIterator last, BinaryPredicate comparator)
    {
        if(!first.isCompatibleWith(last))
        {
            throw new IllegalArgumentException("iterators not compatible");
        } else
        {
            pushHeap(first, first.distance(last) - 1, 0, last.get(-1), comparator);
            return;
        }
    }

    static void pushHeap(BidirectionalIterator first, int holeIndex, int topIndex, Object value, BinaryPredicate comparator)
    {
        int parent = (holeIndex - 1) / 2;
        BidirectionalIterator firstx;
        for(firstx = (BidirectionalIterator)first.clone(); holeIndex > topIndex && comparator.execute(firstx.get(parent), value); parent = (holeIndex - 1) / 2)
        {
            firstx.put(holeIndex, firstx.get(parent));
            holeIndex = parent;
        }

        firstx.put(holeIndex, value);
    }

    public static void popHeap(BidirectionalIterator first, BidirectionalIterator last)
    {
        popHeap(first, last, ((BinaryPredicate) (new Predicates.HashComparator())));
    }

    public static void popHeap(BidirectionalIterator first, BidirectionalIterator last, BinaryPredicate comparator)
    {
        if(!first.isCompatibleWith(last))
        {
            throw new IllegalArgumentException("iterators not compatible");
        } else
        {
            Object old = last.get(-1);
            last.put(-1, first.get());
            adjustHeap(first, 0, first.distance(last) - 1, old, comparator);
            return;
        }
    }

    public static void makeHeap(BidirectionalIterator first, BidirectionalIterator last)
    {
        makeHeap(first, last, ((BinaryPredicate) (new Predicates.HashComparator())));
    }

    public static void makeHeap(BidirectionalIterator first, BidirectionalIterator last, BinaryPredicate comparator)
    {
        if(!first.isCompatibleWith(last))
            throw new IllegalArgumentException("iterators not compatible");
        int len = first.distance(last);
        if(len < 2)
            return;
        int parent = (len - 2) / 2;
        do
        {
            adjustHeap(first, parent, len, first.get(parent), comparator);
            if(parent == 0)
                return;
            parent--;
        } while(true);
    }

    public static void sortHeap(BidirectionalIterator first, BidirectionalIterator last)
    {
        sortHeap(first, last, ((BinaryPredicate) (new Predicates.HashComparator())));
    }

    public static void sortHeap(BidirectionalIterator first, BidirectionalIterator last, BinaryPredicate comparator)
    {
        if(!first.isCompatibleWith(last))
            throw new IllegalArgumentException("iterators not compatible");
        for(BidirectionalIterator lastx = (BidirectionalIterator)last.clone(); first.distance(lastx) > 1; lastx.retreat())
            popHeap(first, lastx, comparator);

    }

    static void adjustHeap(BidirectionalIterator first, int holeIndex, int len, Object value, BinaryPredicate comparator)
    {
        int topIndex = holeIndex;
        int secondChild;
        for(secondChild = 2 * (holeIndex + 1); secondChild < len; secondChild = 2 * (secondChild + 1))
        {
            if(comparator.execute(first.get(secondChild), first.get(secondChild - 1)))
                secondChild--;
            first.put(holeIndex, first.get(secondChild));
            holeIndex = secondChild;
        }

        if(secondChild == len)
        {
            first.put(holeIndex, first.get(secondChild - 1));
            holeIndex = secondChild - 1;
        }
        pushHeap(first, holeIndex, topIndex, value, comparator);
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -