泛型堆排序

简介:
public static <C extends Comparable> void sort(C[] array) {
    if (null == array || 1 >= array.length) {
        return;
    }
    MinHeap<C> root = new MinHeap<>(array[0]);
    for (int i = 1; i < array.length; i++) {
        root.add(array[i]);
        //System.out.println(root.toString());
    }
    //System.out.println();
    for (int i = 0; i < array.length; i++) {
        array[i] = root.pop();
        //System.out.println(root.toString());
    }
}
static class MinHeap<C extends Comparable> {

    static final int CHILDREN_COUNT = 2;

    C value;

    MinHeap<C> parent;

    List<MinHeap<C>> children = new LinkedList<>();

    MinHeap(C value) {
        this.value = value;
    }

    @SuppressWarnings("unchecked")
    C pop() {
        C top = this.value;
        if (!this.children.isEmpty()) {
            int index = 0;
            C val = children.get(0).value;
            for (int i = 1; i < children.size(); i++) {
                if (val.compareTo(children.get(i).value) > 0) {
                    val = children.get(i).value;
                    index = i;
                }
            }
            this.value = children.get(index).value;
            for (MinHeap<C> child : children.get(index).children) {
                child.parent = this;
                children.add(child);
            }
            children.remove(index);
        } else {
            this.value = null;
        }
        return top;
    }

    @SuppressWarnings("unchecked")
    void add(C value) {
        if (children.size() < CHILDREN_COUNT) {
            MinHeap<C> newOne = new MinHeap(value);
            children.add(newOne);
            newOne.parent = this;
            newOne.adjust();
        } else {
            int index = 0;
            int count = children.get(0).children.size();
            for (int i = 1; i < children.size(); i++) {
                if (children.get(i).children.size() < count) {
                    count = children.get(i).children.size();
                    index = i;
                }
            }
            children.get(index).add(value);
        }
    }

    @SuppressWarnings("unchecked")
    private void adjust() {
        if (null != parent && this.value.compareTo(parent.value) < 0) {
            swap(parent, this);
            parent.adjust();
        }
    }

    private void swap(MinHeap<C> parent, MinHeap<C> child) {
        C temp = parent.value;
        parent.value = child.value;
        child.value = temp;
    }

    @Override
    public String toString() {
        StringBuilder builder = new StringBuilder();
        builder.append(this.value);
        if (!this.children.isEmpty()) {
            builder.append("{ ");
            for (MinHeap<C> child : children) {
                builder.append(child.toString()).append(", ");
            }
            builder.append(" }");
        }
        return builder.toString();
    }
}
目录
相关文章
|
6月前
|
Java
java实现二分查找
java实现二分查找
45 0
|
6月前
|
算法 搜索推荐 Java
Java实现冒泡算法
Java实现冒泡算法
51 0
|
6月前
|
搜索推荐 算法 Java
Java实现快速排序
Java实现快速排序
34 0
|
6月前
|
搜索推荐 Java
java实现冒泡排序和快速排序代码
java实现冒泡排序和快速排序
53 1
java实现数组二分查找
java实现数组二分查找
Java实现二分查找
二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想。每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间被缩小为0。 这里我们实现最简单情况下的二分查找。升序排列的数组,无重复元素,查找其中是否包含单个元素。
泛型栈和队列
泛型栈和队列
120 0