zoukankan      html  css  js  c++  java
  • 4.堆排序

    //堆排序研究
    var cc=cc||console
    function parent(i){
        return i>>1
    }
    function left(i){
        return 2*i+1
    }
    function right(i){
        return 2*i+2
    }
    function exchange(A,p1,p2){
        var temp=A[p1]
        A[p1]=A[p2]
        A[p2]=temp
    }
    //维护最大堆的性质
    function max_heapfy(A,i){
        var largest
        var l=left(i)
        var r=right(i)
        if(l<=A.heap_size&&A[l]>A[i]){
            largest=l
        }else{
            largest=i
        }
        if(r<=A.heap_size&&A[r]>A[largest]){
            largest=r
        }
        if(largest!=i){
            exchange(A,i,largest)
            max_heapfy(A,largest)
        }
    }
    var arr=[15,1,34,3,23,12,45,56]
    //建立堆
    function buid_max_heap(A){
        A.heap_size= A.length-1
        for(i= A.length-1>>1;i>=0;i--){
            max_heapfy(A,i)
        }
    }
    buid_max_heap(arr)
    cc.log(arr) //=>[  56, 23, 45, 3, 15, 12, 34, 1, heap_size: 7 ]
    //            15
    //        1      34
    //    3   23    12  45
    //   56
    //            15
    //        1      34
    //    56   23    12  45
    //    3
    //            15
    //        56      34
    //    1   23    12  45
    //    3
    //            56
    //        23      45
    //    3   15    12  34
    //   1
    //堆排序
    function heapsort(A){
        buid_max_heap(A)
        for(var i= A.length-1;i>0;i--){
            exchange(A,0,i)
            A.heap_size=A.heap_size-1
            max_heapfy(A,0)
        }
    }
    heapsort(arr)
    cc.log(arr) //=>[ 1, 3, 12, 15, 23, 34, 45, 56, heap_size: 0 ]
    //放回最大
    function heap_maximum(A){
        return A[1]
    }
    //最大优先队列
    function heap_extract_max(A){
        if(A.heap_size<0){
            throw "heap underflow"
        }
        var max=A[1]
        A[1]=A[A.heap_size-1]
        A.heap_size=A.heap_size-1
        max_heapfy(A,1)
        return max
    }
    //插入最大堆排序
    function heap_increase_key(A,i,key){
        if(key<A[i]){
            throw "new key is smaller than current key"
        }
        A[i]=key
        while(i>0&&A[parent(i)]<A[i]){
            exchange(A,i,parent(i))
            i=parent(i)
        }
    }
    //插入最大堆
    function max_heap_insert(A,key){
        A.heap_size= A.heap_size+1
        A[A.heap_size]=0
        heap_increase_key(A, A.heap_size,key)
    }
  • 相关阅读:
    Flask把变量注册到模板中
    $.each与$(data).each区别
    【Python备忘】python判断文件和文件夹是否存在
    ISP图像质量自动化测试方法
    使用微软的(how-old.net)构建智能门店管理系统
    在virtualenv中安装libxml2和libxslt
    Python 装饰器学习以及实际使用场景实践
    tensorflow零起点快速入门(4) --入门常用API
    tensorflow零起点快速入门(3)
    树莓派和STM32通过USB和串口通信记录
  • 原文地址:https://www.cnblogs.com/caoke/p/4389748.html
Copyright © 2011-2022 走看看