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)
}

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。