IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 树形选择排序 -> 正文阅读

[数据结构与算法]树形选择排序

树形选择排序一个很重的条件就是:所排序的数组个数必须是2的次幂,这样才能满足完全二叉树的形态,如果不是2的次幂,则用无穷大值去填充,使其个数称为2的次幂。

代码如下:

  /**
     * 树形选择排序。
     * 注意:datas的长度必须满足2的k次幂。
     *
     * @param datas 待排序数据
     */
    public static void treeSelectionSort(int[] datas) {
        int length = datas.length; // 待排序的数组长度,length一定要是2的幂次方,如果不是则扩大到2的幂次方

        if (!((length & (length - 1)) == 0)) {// 判断length是否是2的幂次方
            int minPower = minPower(length);
            length = (int) Math.pow(2, minPower + 1);
        }
        int treeSize = length * 2 - 1; // 树的存储大小
        int[] tree = new int[treeSize]; // 树的存储空间

        // 由后向前将待排序数据存储在树中(叶子节点)
        for (int i = length - 1, j = treeSize - 1; i >= 0; i--, j--) {
            if (i > datas.length - 1) {
                tree[j] = MAX;
            } else {
                tree[j] = datas[i];
            }
        }
        // 填充非叶子节点
        for (int i = treeSize - 1 - length; i >= 0; i--) {
            tree[i] = Integer.min(tree[2 * i + 1], tree[2 * i + 2]);
        }
        PrintUtil.printIntArray(tree);


        // 排序
        int i = 0;
        while (i < datas.length) {
            int minValue = tree[0];
            datas[i] = minValue; // 最小值

            // 将树中次最小值替换为无穷大值
            int minIndex = 0;// 最小值下标
            while (true) {
                int a = (minIndex + 1) * 2 - 1;
                int b = (minIndex + 1) * 2;
                if (a > tree.length - 1 || b > tree.length - 1) {
                    break;
                }
                int v1 = tree[a];
                int v2 = tree[b];
                // 将最小值的结点置为无穷大
                minIndex = Math.min(v1, v2) == v1 ? a : b;
                tree[minIndex] = MAX;
            }

            // 重新选择生成胜利树,找出最小值
            while (minIndex > 0) {
                if (minIndex % 2 == 0) {
                    tree[minIndex / 2 - 1] = Math.min(tree[minIndex], tree[minIndex - 1]);
                    minIndex = minIndex / 2 - 1;
                } else {
                    tree[minIndex / 2] = Math.min(tree[minIndex], tree[minIndex + 1]);
                    minIndex = minIndex / 2;
                }
            }
            i++;
        }
    }

    /**
     * 求number的2的对数
     */
    private static int minPower(int number) {
        for (int i = 1; i < Integer.MAX_VALUE; i++) {
            if (Math.pow(2, i) < 10 && Math.pow(2, i + 1) > 10) {
                return i;
            }
        }
        return -1;
    }

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-04 11:27:49  更:2021-08-04 11:29:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:21:35-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码