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>