泛型堆排序

简介:
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();
    }
}
目录
相关文章
|
移动开发 小程序 前端开发
Taro 的实现原理是怎么样的?
Taro 的实现原理是怎么样的?
678 0
|
12月前
|
SEO
wordpress如何添加tag标签页面
如何在 WordPress 中添加标签页面
567 2
|
11月前
|
安全 网络安全 数据安全/隐私保护
第六问:http和https区别与联系
HTTP 和 HTTPS 是现代网络通信中的两种重要协议。HTTP 是明文传输协议,无加密功能;HTTPS 在 HTTP 基础上加入 SSL/TLS 加密层,提供数据加密、身份验证和数据完整性保障。HTTP 适用于非敏感信息传输,如新闻网站;HTTPS 适用于在线支付、账户登录等需要保护用户数据的场景。
|
JavaScript
Vue3骨架屏(Skeleton)
该文章介绍了一个名为Skeleton的Vue组件,用于创建加载时的占位符界面,包含多种可配置项如按钮、输入框、图像等,并支持动画效果。
353 0
Vue3骨架屏(Skeleton)
|
数据可视化 图形学
小功能⭐️Unity2018 Shader Graph——全息影像、物体消融
小功能⭐️Unity2018 Shader Graph——全息影像、物体消融
|
前端开发 UED
CSS动画效果(炫酷登录页面)
CSS动画效果(炫酷登录页面)
语法树的画法(根据文法求字符串)
语法树的画法(根据文法求字符串)
277 1
|
SQL 关系型数据库 数据库
PostgreSQL 常用函数分享
PostgreSQL 常用函数分享
329 0
|
SQL 数据库 HIVE
hive宽表窄表互转
hive宽表窄表互转
|
监控 数据安全/隐私保护 iOS开发
服务器监控新利器:ServerBee带你看透服务器运行状态
服务器监控新利器:ServerBee带你看透服务器运行状态
548 0
下一篇
oss云网关配置