JavaScript Switc堆排序

 算法详解

堆排序是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

1.首先将待排序的数组构造成一个大根堆,此时,整个数组的最大值就是堆结构的顶端

2.将顶端的数与末尾的数交换,此时,末尾的数为最大值,剩余待排序数组个数为n-1

3.将剩余的n-1个数再构造成大根堆,再将顶端数与n-1位置的数交换,如此反复执行,便能得到有序数组

代码:


    <script type="text/javascript">

                    // 交换两个节点function swap(A, i, j) 

                    {

                        let temp = A[i];

                    A[i] = A[j];

                    A[j] = temp;

                    }

                    

                    // 将 i 结点以下的堆整理为大顶堆,注意这一步实现的基础实际上是:

                    // 假设 结点 i 以下的子堆已经是一个大顶堆,adjustheap 函数实现的

                    // 功能是实际上是:找到 结点 i 在包括结点 i 的堆中的正确位置。后面

                    // 将写一个 for 循环,从第一个非叶子结点开始,对每一个非叶子结点

                    // 都执行 adjustheap 操作,所以就满足了结点 i 以下的子堆已经是一大

                    //顶堆

                    function adjustHeap(A, i, length) {

                    let temp = A[i]; // 当前父节点

                    // j<length 的目的是对结点 i 以下的结点全部做顺序调整

                    for(let j = 2*i+1; j<length; j = 2*j+1) {

                        temp = A[i];  // 将 A[i] 取出,整个过程相当于找到 A[i] 应处于的位置

                        if(j+1 < length && A[j] < A[j+1]) {

                        j++;   // 找到两个孩子中较大的一个,再与父节点比较

                        }

                        if(temp < A[j]) {

                        swap(A, i, j) // 如果父节点小于子节点:交换;否则跳出

                        i = j;  // 交换后,temp 的下标变为 j

                        } else {

                        break;

                        }

                    }

                    }

                    

                    // 堆排序

                    function heapSort(A) {

                    // 初始化大顶堆,从第一个非叶子结点开始

                    for(let i = Math.floor(A.length/2-1); i>=0; i--) {

                        adjustHeap(A, i, A.length);

                    }

                    // 排序,每一次for循环找出一个当前最大值,数组长度减一

                    for(let i = Math.floor(A.length-1); i>0; i--) {

                        swap(A, 0, i); // 根节点与最后一个节点交换

                        adjustHeap(A, 0, i); // 从根节点开始调整,并且最后一个结点已经为当

                                            // 前最大值,不需要再参与比较,所以第三个参数

                                            // 为 i,即比较到最后一个结点前一个即可

                    }

                    }

                    

                    let Arr = [4, 6, 8, 5, 9, 1, 2, 5, 3, 2];

                    heapSort(Arr);

                    alert(Arr);

    </script>



这是我所学到的,所以我要分享给你们,希望可以帮助到你们。

以上就是我的分享,新手上道,请多多指教大神勿喷

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值