您的位置:首页 > Web前端 > JavaScript

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

2017-07-07 23:21 573 查看
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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  学习笔记