js完成堆排序

堆排序
组织大顶堆

第一个元素就是最大的,然后跟末了一个元素交流,把最大的弹出栈
第一个元素与它的摆布子节点比较,摆布子节点中较大的比它大则交流 然后再递归地如许交流下去直到没有比它大的子节点或许没有子节点。

云云循环往复 晓得数组长度变成0



<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
  </head>
  <body>
    <h1><%= title %></h1>
    <p>Welcome to <%= title %></p>

    <script type="text/javascript">
        var content = "<%=content%>";
        document.write(content);
    </script>

    <script type="text/javascript">


        // var arr = [4];
        var arr = [4, 72, 2, 3, 9, 7, 5, 6, 12, 63, 10];
        var tempArr = [];

        function heapSortArr(arr) {
            //大顶堆
            function make_tree(arr) {
                for(var i = 0; i < arr.length; i++) {
                    var v = arr[i], 
                        len = tempArr.length;
                    tempArr[len] = v;
                    while(tempArr[len] > tempArr[parseInt(len / 2)]) {
                        swapArrValue(len, parseInt(len / 2));
                        len = parseInt(len / 2);
                    }
                }
            }

            function swapArrValue(a, b) {
                tempArr[a] = tempArr[a] ^ tempArr[b];
                tempArr[b] = tempArr[b] ^ tempArr[a];
                tempArr[a] = tempArr[a] ^ tempArr[b];
                return true;
            }

            var sortArr = [];

            function sort_tree(n) {
                swapArrValue(0, n);
                sortArr.push(tempArr.pop());
                if(n) {
                    exchange_tree(0);
                    sort_tree(n - 1);
                }
            }

            function exchange_tree(i) {
                var len = tempArr.length;
                if(i * 2 + 2 < len - 1) { //有摆布子节点
                    if(tempArr[i * 2 + 1] > tempArr[i * 2 + 2]) {
                        tempArr[i] < tempArr[i * 2 + 1] && swapArrValue(i, i * 2 + 1) && exchange_tree(i * 2 + 1);
                    } else {
                        tempArr[i] < tempArr[i * 2 + 2] && swapArrValue(i, i * 2 + 2) && exchange_tree(i * 2 + 2);
                    }
                } else if(i * 2 + 1 < len - 1) {     //只要左节点
                    tempArr[i] < tempArr[i * 2 + 1] && swapArrValue(i, i * 2 + 1) && exchange_tree(i * 2 + 1);
                }
            }
            make_tree(arr);
            sort_tree(tempArr.length - 1);
            return sortArr;
        }

        console.log(arr);
        arr = heapSortArr(arr);
        console.log(arr);

    </script>
  </body>
</html>


    原文作者:炑木
    原文地址: https://segmentfault.com/a/1190000008767822
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞