#004# 堆(重写)

Posted xkxf

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#004# 堆(重写)相关的知识,希望对你有一定的参考价值。

如下:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
    </head>
    <body>
        <textarea id="data-area" rows="25" cols="80" placeholder="paste your data here..."></textarea>
        <p><button id="run">run code</button></p>
        
        <script type="text/javascript">
            let btn = document.querySelector("#run");
            btn.addEventListener("click", handleClick);

            function handleClick() {
                let dataArea = document.querySelector(#data-area);
                let data = dataArea.value;
                let arr = CommonUtil.handleData(data);
                // 样例输入:2 8 1 14 7 9 3 10 4 16
                console.log(before:, arr);
                Heap.buildMaxHeap(arr);
                console.log(after:, arr);
            }            
        </script>
        
        <script type="text/javascript">
            class CommonUtil {
                static handleData(data) {
                    let result = [];
                    let digit = /-?d+/g;
                    let match;
                    while(match = digit.exec(data)) {
                        result.push(Number(match[0]));
                    }
                    return result;
                }    
            }
        </script>
        
        
        <script type="text/javascript">
            class Heap {
                // 把数组A转化为最大堆
                static buildMaxHeap(A) {
                    A.unshift(undefined); // 便于后续的下标计算
                    
                    A.heapSize = A.length - 1; // 实际多存了一个undefined
                    for (let i = Math.floor(A.heapSize / 2); i >= 1; --i) {
                        // 对所有非叶结点调用一次maxHeapify
                        // 之所以下标从后往前,是因为maxHeapify假定调用结点的左右子树都已经为最大堆
                        // 单个元素(叶结点)很自然地是一个最大堆
                        Heap.maxHeapify(A, i);
                    }
                }
                
                // 维护堆的性质
                static maxHeapify(A, i) {
                    let l = Heap.left(i);
                    let r = Heap.right(i);
                    
                    let largest = i;
                    // maxHeapify假定调用结点的左右子树都已经为最大堆
                    // 只是把调用结点i放到恰当的位置,以维护堆的性质
                    if (l <= A.heapSize && A[l] > A[i]) {
                        largest = l;
                    }
                    
                    if (r <= A.heapSize && A[r] > A[largest]) {
                        largest = r;
                    }
                    
                    if (largest != i) {
                        A[largest] = A[i] + A[largest];
                        A[i] = A[largest] - A[i];
                        A[largest] = A[largest] - A[i];
                        Heap.maxHeapify(A, largest);
                    }
                }
                
                static left(i) {
                    return 2 * i;
                }
                
                static right(i) {
                    return 2 * i + 1;
                }
            }
        </script>
    </body>
</html>

 技术分享图片

 

以上是关于#004# 堆(重写)的主要内容,如果未能解决你的问题,请参考以下文章

004数组

14.VisualVM使用详解15.VisualVM堆查看器使用的内存不足19.class文件--文件结构--魔数20.文件结构--常量池21.文件结构访问标志(2个字节)22.类加载机制概(代码片段

推进学说代码片段

java 代码片段

从片段调用 Google Play 游戏服务

Java排序算法 - 堆排序的代码