(六)c++和JavaScript实现二叉堆

来源:互联网 发布:java验证码识别算法 编辑:程序博客网 时间:2024/06/11 23:27




c++实现


#ifndef INC_05_HEAPIFY_HEAP_H
#define INC_05_HEAPIFY_HEAP_H


#include <algorithm>
#include <cassert>


using namespace std;




template<typename Item>
class MaxHeap{


private:
    Item *data;
    int count;
    int capacity;


    void shiftUp(int k){
        while( k > 1 && data[k/2] < data[k] ){
            swap( data[k/2], data[k] );
            k /= 2;
        }
    }


    void shiftDown(int k){
        while( 2*k <= count ){
            int j = 2*k;
            if( j+1 <= count && data[j+1] > data[j] ) j ++;
            if( data[k] >= data[j] ) break;
            swap( data[k] , data[j] );
            k = j;
        }
    }


public:


    MaxHeap(int capacity){
        data = new Item[capacity+1];
        count = 0;
        this->capacity = capacity;
    }


    MaxHeap(Item arr[], int n){
        data = new Item[n+1];
        capacity = n;


        for( int i = 0 ; i < n ; i ++ )
            data[i+1] = arr[i];
        count = n;


        for( int i = count/2 ; i >= 1 ; i -- )
            shiftDown(i);
    }


    ~MaxHeap(){
        delete[] data;
    }


    int size(){
        return count;
    }


    bool isEmpty(){
        return count == 0;
    }


    void insert(Item item){
        assert( count + 1 <= capacity );
        data[count+1] = item;
        shiftUp(count+1);
        count ++;
    }


    Item extractMax(){
        assert( count > 0 );
        Item ret = data[1];
        swap( data[1] , data[count] );
        count --;
        shiftDown(1);
        return ret;
    }


    Item getMax(){
        assert( count > 0 );
        return data[1];
    }
};


#endif //INC_05_HEAPIFY_HEAP_H


























javascript实现
<!DOCTYPE html>








<html>




<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <title></title>
  
</head>




<body>
 
  
  <script>
  
  
  function Heap(){
this.arr=new Array();
this.count=0;
this.size=function(){
return this.count;
};
this.isEmpty=function(){
return this.count==0;
}
this.insert=function(item){
this.count++;
this.arr[this.count]=item;
this.shiftUp(this.count);
}
this.extractMax=function(){
var temp=this.arr[1];
this.arr[1]=this.arr[count];
this.count--;
this.shiftDown(1);
return temp;

}

this.shiftDown=function(index){
while(index*2<=this.count){
var j=index*2;
if(j+1<=this.count&&this.arr[j+1]>this.arr[j]){
j++;

}
if(this.arr[j]<this.arr[index]){
 break;
}
var temp=this.arr[j];
this.arr[j]=this.arr[index];
this.arr[index]=temp;
index=j;
}

/*if(index>count||index*2>count||(index*2+1)>count){
return;
}

var left=index*2;
var right=index*2+1;
if(arr[left]>arr[right]){
if(arr[left]>arr[index]){
var temp=arr[left];
arr[left]=arr[index];
arr[index]=temp;
shiftDown[left];
}
}else{
if(arr[right]>arr[index]){
var temp=arr[right];
arr[right]=arr[index];
arr[index]=temp;
shiftDown[right];
}
}*/

}
this.shiftUp=function(index){
var parent=Number.parseInt(index/2);
if(parent<1){
 return;
}
if(this.arr[index]>this.arr[parent]){
var temp=this.arr[parent];
this.arr[parent]=this.arr[index];
this.arr[index]=temp;

this.shiftUp(parent);
}

}
this.heapify=function(data){
debugger;
for(var i=0;i<data.length;i++){
this.arr[i+1]=data[i];
}
this.count=this.arr.length;
var n=Number.parseInt(this.count/2);
for(var j=n;j>0;j--){
this.shiftDown(j);
}
data=new Array();
for(var i=this.count;i>0;i--){
data[i-1]=this.arr[i];
}
return data;
}
this.show=function(){
alert(this.arr);
}
  }




var arrEX=[4,1,10,9,3,6,19,12,11,14,48,99,56,45];
var heap=new Heap();


alert(heap.heapify(arrEX));
/*for(var i=0;i<arrEX.length; i++){
heap.insert(arrEX[i]);
}
heap.show();*/


  </script>
  
</body>




</html>
原创粉丝点击