(六)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>
#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>
相关文章推荐
- 利用MFC实现浏览器的定制与扩展(JavaScript与C++交互)
- activex scripting 实现c++ 和 javascript交互
- 二叉堆 C++实现
- 学习笔记:冒泡排序的C++、JavaScript、Java实现
- 分别用C++和JavaScript 实现四则运算表达式求值
- Ajax - JavaScript之实现私有属性、像C++和Java一样支持基于类的继承方法之例子
- 使用C++实现二叉堆
- 利用MFC实现浏览器的定制与扩展(JavaScript与C++交互)
- 数据结构二叉堆C++实现 最小堆
- 学习笔记:快速排序的C++、JavaScript(2种方法)、Java实现
- 用数组实现小顶堆(二叉堆)的C++代码
- C++二叉堆的实现
- libj 0.8.2 发布,Java/JavaScript API 的 C++ 实现
- 日历的问题C语言,C++(boost),python,Javascript,Java和Matlab实现
- 数据结构二叉堆C++实现 最小堆
- Qt webKit--实现本地QObject(c++)和JavaScript交互
- 二叉堆(二)之 C++的实现
- node中javascript调用c++实现过程分析
- 数据结构图文解析之:二叉堆详解及C++模板实现
- 大顶堆的C++模板实现及二叉堆的简介